docs: def run(self) -> None:
          """
          Read lines and put them on the queue.
          """
          fd = self._fd
          encoding = self._encoding
          line_terminators = self._line_terminators
          queue = self._queue
          buf = ""
          while True:
              try:
                  c = fd.read(1).decode(encoding)
              except UnicodeDecodeError as e:
                  log.warning("Decoding error from {!r}: {!r}", self._cmdargs, e)
                  if self._suppress_decoding_errors:
                      continue
                  else:
                      raise
              # log.critical("c={!r}, returncode={!r}", c, p.returncode)
              if not c:
                  # Subprocess has finished
                  return
              buf += c
              # log.critical("buf={!r}", buf)
              # noinspection PyTypeChecker
              for t in line_terminators:
                  try:
                      t_idx = buf.index(t) + len(t)  # include terminator
                      fragment = buf[:t_idx]
                      buf = buf[t_idx:]
                      queue.put(fragment)
                  except ValueError:
                      pass