code: def ProcessIterator(pids, process_regex_string, ignore_grr_process, error_list):
    
    pids = set(pids)
    if ignore_grr_process:
      grr_pid = psutil.Process().pid
    else:
      grr_pid = -1
  
    if process_regex_string:
      process_regex = re.compile(process_regex_string)
    else:
      process_regex = None
  
    if pids:
      process_iterator = []
      for pid in pids:
        try:
          process_iterator.append(psutil.Process(pid=pid))
        except Exception as e:  # pylint: disable=broad-except
          error_list.Append(
              rdf_memory.ProcessMemoryError(
                  process=rdf_client.Process(pid=pid), error=str(e)))
    else:
      process_iterator = psutil.process_iter()
  
    for p in process_iterator:
      if process_regex and not process_regex.search(p.name()):
        continue
  
      if p.pid == grr_pid:
        continue
  
      yield p
docs: Yields all (psutil-) processes that match certain criteria.
  
    Args:
      pids: A list of pids. If given, only the processes with those pids are
        returned.
      process_regex_string: If given, only processes whose name matches the regex
        are returned.
      ignore_grr_process: If True, the grr process itself will not be returned.
      error_list: All errors while handling processes are appended to this list.
        Type is repeated ProcessMemoryError.
  
    Yields:
      psutils.Process objects matching all criteria.