code: def _check_blockers(
      tmp_dir, lock, info, *, mode, waiters
  ):  # noqa: C901, PLR0912
      from .lock import LockError
  
      non_existing_pid = set()
  
      blockers = []
      to_release = defaultdict(list)
      for path, infos in lock[mode].items():
          for waiter_path in waiters:
              if localfs.overlaps(waiter_path, path):
                  break
          else:
              continue
  
          infos = infos if isinstance(infos, list) else [infos]
          for blocker in infos:
              if blocker == info:
                  continue
  
              pid = int(blocker["pid"])
  
              if pid in non_existing_pid:
                  pass
              elif psutil.pid_exists(pid):
                  blockers.append(blocker)
                  continue
              else:
                  non_existing_pid.add(pid)
                  cmd = blocker["cmd"]
                  logger.warning(
                      (
                          "Process '%s' with (Pid %s), in RWLock-file '%s'"
                          " had been killed. Auto removed it from the lock file."
                      ),
                      cmd,
                      pid,
                      relpath(path),
                  )
              to_release[json.dumps(blocker, sort_keys=True)].append(
                  path
              )
  
      if to_release:
          for info_json, path_list in to_release.items():
              info = json.loads(info_json)
              if mode == "read":
                  _release_read(lock, info, path_list)
              elif mode == "write":
                  _release_write(lock, info, path_list)
  
      if blockers:
          raise LockError(
              f"'{waiter_path}' is busy, it is being blocked by:\n"
              f"{_infos_to_str(blockers)}\n"
              "\n"
              "If there are no processes with such PIDs, you can manually "
              f"remove '{tmp_dir}/rwlock' and try again."
          )
  
imports: import json
  import os
  from collections import defaultdict
  from contextlib import contextmanager
  import psutil
  from voluptuous import Invalid, Optional, Required, Schema
  from dvc.log import logger
  from .exceptions import DvcException
  from .fs import localfs
  from .lock import make_lock
  from .utils import relpath
label_desc: Use image node_id 3 for calling a global function with example usage: _check_blockers(tmp_dir, lock, info) without return types