util/ProcessLogger.py
changeset 1519 f7ac0d11118e
parent 1516 9db0b436fbb3
child 1539 8e5c03798abc
equal deleted inserted replaced
1518:a656ccb868d4 1519:f7ac0d11118e
   107         self.exitcode = None
   107         self.exitcode = None
   108         self.outdata = []
   108         self.outdata = []
   109         self.errdata = []
   109         self.errdata = []
   110         self.keyword = keyword
   110         self.keyword = keyword
   111         self.kill_it = kill_it
   111         self.kill_it = kill_it
       
   112         self.startsem = Semaphore(0)        
   112         self.finishsem = Semaphore(0)
   113         self.finishsem = Semaphore(0)
   113         self.endlock = Lock()
   114         self.endlock = Lock()
   114 
   115 
   115         popenargs= {
   116         popenargs= {
   116                "cwd":os.getcwd() if cwd is None else cwd,
   117                "cwd":os.getcwd() if cwd is None else cwd,
   143         self.errt = outputThread(
   144         self.errt = outputThread(
   144                       self.Proc,
   145                       self.Proc,
   145                       self.Proc.stderr,
   146                       self.Proc.stderr,
   146                       self.errors)
   147                       self.errors)
   147         self.errt.start()
   148         self.errt.start()
       
   149         self.startsem.release()
   148 
   150 
   149 
   151 
   150     def output(self,v):
   152     def output(self,v):
   151         self.outdata.append(v)
   153         self.outdata.append(v)
   152         self.outlen += 1
   154         self.outlen += 1
   166     def log_the_end(self,ecode,pid):
   168     def log_the_end(self,ecode,pid):
   167         self.logger.write(self.Command_str + "\n")
   169         self.logger.write(self.Command_str + "\n")
   168         self.logger.write_warning(_("exited with status %s (pid %s)\n")%(str(ecode),str(pid)))
   170         self.logger.write_warning(_("exited with status %s (pid %s)\n")%(str(ecode),str(pid)))
   169 
   171 
   170     def finish(self, pid,ecode):
   172     def finish(self, pid,ecode):
       
   173         self.startsem.acquire()
   171         if self.timeout:
   174         if self.timeout:
   172             self.timeout.cancel()
   175             self.timeout.cancel()
   173         self.exitcode = ecode
   176         self.exitcode = ecode
   174         if self.exitcode != 0:
   177         if self.exitcode != 0:
   175             self.log_the_end(ecode,pid)
   178             self.log_the_end(ecode,pid)
   177             self.finish_callback(self,ecode,pid)
   180             self.finish_callback(self,ecode,pid)
   178         self.errt.join()
   181         self.errt.join()
   179         self.finishsem.release()
   182         self.finishsem.release()
   180 
   183 
   181     def kill(self,gently=True):
   184     def kill(self,gently=True):
       
   185         self.startsem.acquire()        
   182         self.outt.killed = True
   186         self.outt.killed = True
   183         self.errt.killed = True
   187         self.errt.killed = True
   184         if wx.Platform == '__WXMSW__':
   188         if wx.Platform == '__WXMSW__':
   185             PROCESS_TERMINATE = 1
   189             PROCESS_TERMINATE = 1
   186             handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, self.Proc.pid)
   190             handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, self.Proc.pid)