docs: def get_proc_dir(cachedir, **kwargs):
      '''
      Given the cache directory, return the directory that process data is
      stored in, creating it if it doesn't exist.
      The following optional Keyword Arguments are handled:
  
      mode: which is anything os.makedir would accept as mode.
  
      uid: the uid to set, if not set, or it is None or -1 no changes are
           made. Same applies if the directory is already owned by this
           uid. Must be int. Works only on unix/unix like systems.
  
      gid: the gid to set, if not set, or it is None or -1 no changes are
           made. Same applies if the directory is already owned by this
           gid. Must be int. Works only on unix/unix like systems.
      '''
      fn_ = os.path.join(cachedir, 'proc')
      mode = kwargs.pop('mode', None)
  
      if mode is None:
          mode = {}
      else:
          mode = {'mode': mode}
  
      if not os.path.isdir(fn_):
          # proc_dir is not present, create it with mode settings
          os.makedirs(fn_, **mode)
  
      d_stat = os.stat(fn_)
  
      # if mode is not an empty dict then we have an explicit
      # dir mode. So lets check if mode needs to be changed.
      if mode:
          mode_part = S_IMODE(d_stat.st_mode)
          if mode_part != mode['mode']:
              os.chmod(fn_, (d_stat.st_mode ^ mode_part) | mode['mode'])
  
      if hasattr(os, 'chown'):
          # only on unix/unix like systems
          uid = kwargs.pop('uid', -1)
          gid = kwargs.pop('gid', -1)
  
          # if uid and gid are both -1 then go ahead with
          # no changes at all
          if (d_stat.st_uid != uid or d_stat.st_gid != gid) and \
                  [i for i in (uid, gid) if i != -1]:
              os.chown(fn_, uid, gid)
  
      return fn_