docs: def _add_file(self, path, **params):
          """
          Attempt to add a file to the system monitoring mechanism.
      """
          log = self._getparam('log', self._discard, **params)
          fd = None
          try:
              fd = os.open(path, os.O_RDONLY)
          except Exception as e:
              if not self.paths[path]:
                  log.error("Open failed on watched path %r -- %s", path, e, exc_info=log.isEnabledFor(logging.DEBUG))
                  raise e
              elif path in self.paths_pending:
                  log.debug("path %r is still pending -- %s", path, e)
              else:
                  self.paths_pending[path] = True
                  log.debug("Added %r to pending list after open failure -- %s", path, e)
              return False
          if self._mode == WF_KQUEUE:
              log.debug("path %s opened as fd %d", path, fd)
              try:
                  ev = select.kevent(fd,
                      filter=select.KQ_FILTER_VNODE,
                      flags=select.KQ_EV_ADD | select.KQ_EV_CLEAR,
                      fflags=select.KQ_NOTE_WRITE | select.KQ_NOTE_ATTRIB | select.KQ_NOTE_LINK |
                                  select.KQ_NOTE_DELETE | select.KQ_NOTE_RENAME)
                  self._kq.control([ev], 0, 0)
              except Exception as e:
                  log.error("kevent failed on watched path %r -- %s", path, e)
                  try: os.close(fd)
                  except: pass
                  raise e
  
          elif self._mode == WF_INOTIFYX:
              #  inotify doesn't need the target paths open, so now it is known to be
              #  accessible, close the actual fd and use the watch-descriptor as the fd.
              #
              #  However, due to an apparent simfs bug where inotify does not fire either
              #  IN_DELETE_SELF or IN_MOVE_SELF, we need to record the inode so that we
              #  can detect deletes and renames internally.  simfs is used in containers.
              #
              try:
                  s = os.fstat(fd)
                  self._inx_inode[path] = s.st_ino
              except Exception as e:
                  log.error("fstat(%d) failed on open path %r -- %s", fd, path, e)
                  try: os.close(fd)
                  except: pass
                  raise e
              try: os.close(fd)
              except: pass
              try:
                  fd = pynotifyx.add_watch(self._inx_fd, path, self._inx_mask)
                  log.debug("path %s watched with wd %d", path, fd)
              except Exception as e:
                  log.error("inotify failed on watched path %r -- %s", path, e)
                  raise e
  
          elif self._mode == WF_POLLING:
              log.debug("path %s opened as fd %d", path, fd)
              fstate = self._poll_get_stat(fd, path)
              if fstate:
                  self._poll_stat[fd] = fstate
  
          self.paths_open[path] = fd
          self.fds_open[fd] = path
          return True