diff -r 4e0cd7806776 -r ce21ce181fdb util/ProcessLogger.py --- a/util/ProcessLogger.py Tue Mar 02 09:28:44 2021 +0100 +++ b/util/ProcessLogger.py Tue Mar 02 09:42:50 2021 +0100 @@ -28,7 +28,8 @@ import sys import subprocess import ctypes -from threading import Timer, Lock, Thread, Semaphore +import time +from threading import Timer, Lock, Thread, Semaphore, Condition import signal _debug = os.path.exists("BEREMIZ_DEBUG") @@ -154,6 +155,10 @@ self.errt.start() self.startsem.release() + self.spinwakeuplock = Lock() + self.spinwakeupcond = Condition(self.spinwakeuplock) + self.spinwakeuptimer = None + def output(self, v): if v and self.output_encoding: v = v.decode(self.output_encoding) @@ -192,6 +197,7 @@ self.finish_callback(self, ecode, pid) self.errt.join() self.finishsem.release() + self.spinwakeup() def kill(self, gently=True): # avoid running kill before start is finished @@ -222,7 +228,22 @@ if not self.outt.finished and self.kill_it: self.kill() self.finishsem.release() + self.spinwakeup() + + def spinwakeup(self): + with self.spinwakeuplock: + if self.spinwakeuptimer is not None: + self.spinwakeuptimer.cancel() + self.spinwakeuptimer = None + self.spinwakeupcond.notify() def spin(self): - self.finishsem.acquire() + start = time.time() + while not self.finishsem.acquire(0): + with self.spinwakeuplock: + self.spinwakeuptimer = Timer(0.1, self.spinwakeup) + self.spinwakeuptimer.start() + self.spinwakeupcond.wait() + self.logger.progress("%.3fs"%(time.time() - start)) + return [self.exitcode, "".join(self.outdata), "".join(self.errdata)]