Esempio n. 1
0
 def run(self):
     log_interactive.info("Pipe engine thread started.")
     try:
         for p in self.active_pipes:
             p.start()
         sources = self.active_sources
         sources.add(self)
         exhausted = set([])
         RUN = True
         STOP_IF_EXHAUSTED = False
         while RUN and (not STOP_IF_EXHAUSTED or len(sources) > 1):
             fds = select_objects(sources, 2)
             for fd in fds:
                 if fd is self:
                     cmd = self._read_cmd()
                     if cmd == "X":
                         RUN = False
                         break
                     elif cmd == "B":
                         STOP_IF_EXHAUSTED = True
                     elif cmd == "A":
                         sources = self.active_sources - exhausted
                         sources.add(self)
                     else:
                         warning(
                             "Unknown internal pipe engine command: %r. Ignoring."
                             % cmd)
                 elif fd in sources:
                     try:
                         fd.deliver()
                     except Exception as e:
                         log_interactive.exception(
                             "piping from %s failed: %s" % (fd.name, e))
                     else:
                         if fd.exhausted():
                             exhausted.add(fd)
                             sources.remove(fd)
     except KeyboardInterrupt:
         pass
     finally:
         try:
             for p in self.active_pipes:
                 p.stop()
         finally:
             self.thread_lock.release()
             log_interactive.info("Pipe engine thread stopped.")
Esempio n. 2
0
 def run(self):
     log_interactive.info("Pipe engine thread started.")
     try:
         for p in self.active_pipes:
             p.start()
         sources = self.active_sources
         sources.add(self.__fdr)
         exhausted = set([])
         RUN = True
         STOP_IF_EXHAUSTED = False
         while RUN and (not STOP_IF_EXHAUSTED or len(sources) > 1):
             fds, fdo, fde = select.select(sources, [], [])
             for fd in fds:
                 if fd is self.__fdr:
                     cmd = os.read(self.__fdr, 1)
                     if cmd == "X":
                         RUN = False
                         break
                     elif cmd == "B":
                         STOP_IF_EXHAUSTED = True
                     elif cmd == "A":
                         sources = self.active_sources-exhausted
                         sources.add(self.__fdr)
                     else:
                         warning(
                             "Unknown internal pipe engine command: %r. Ignoring." % cmd)
                 elif fd in sources:
                     try:
                         fd.deliver()
                     except Exception, e:
                         log_interactive.exception(
                             "piping from %s failed: %s" % (fd.name, e))
                     else:
                         if fd.exhausted():
                             exhausted.add(fd)
                             sources.remove(fd)
     except KeyboardInterrupt:
         pass
     finally:
         try:
             for p in self.active_pipes:
                 p.stop()
         finally:
             self.thread_lock.release()
             log_interactive.info("Pipe engine thread stopped.")