AbstractPollTask: add _wait_loop method
authorZac Medico <zmedico@gentoo.org>
Wed, 8 Feb 2012 03:58:48 +0000 (19:58 -0800)
committerZac Medico <zmedico@gentoo.org>
Wed, 8 Feb 2012 03:58:48 +0000 (19:58 -0800)
pym/_emerge/AbstractPollTask.py
pym/_emerge/SubProcess.py

index 13e3c23f9059a851e67b988b02a5d9399c7a7739..b4728e7a242db5a4ea51e30dfdc75ecdaf792296 100644 (file)
@@ -1,10 +1,11 @@
-# Copyright 1999-2011 Gentoo Foundation
+# Copyright 1999-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 import array
 import errno
 import logging
 import os
+import time
 
 from portage.util import writemsg_level
 from _emerge.AsynchronousTask import AsynchronousTask
@@ -121,3 +122,23 @@ class AbstractPollTask(AsynchronousTask):
                                self._unregister()
                                self.wait()
 
+       def _wait_loop(self, timeout=None):
+
+               if timeout is None:
+                       while self._registered:
+                               self.scheduler.iteration()
+                       return
+
+               remaining_timeout = timeout
+               start_time = time.time()
+               while self._registered:
+                       self.scheduler.iteration()
+                       elapsed_time = time.time() - start_time
+                       if elapsed_time < 0:
+                               # The system clock has changed such that start_time
+                               # is now in the future, so just assume that the
+                               # timeout has already elapsed.
+                               break
+                       remaining_timeout = timeout - 1000 * elapsed_time
+                       if remaining_timeout <= 0:
+                               break
index c3dc74a91fff9c0abdc81c1033c7154d24eb935c..17a3e8f20cdcddd5d340377b7b37f14dba12245b 100644 (file)
@@ -64,8 +64,7 @@ class SubProcess(AbstractPollTask):
 
                if self._registered:
                        if self.cancelled:
-                               timeout = self._cancel_timeout
-                               self.scheduler.schedule(self._reg_id, timeout=timeout)
+                               self._wait_loop(timeout=self._cancel_timeout)
                                if self._registered:
                                        try:
                                                os.kill(self.pid, signal.SIGKILL)
@@ -73,12 +72,11 @@ class SubProcess(AbstractPollTask):
                                                if e.errno != errno.ESRCH:
                                                        raise
                                                del e
-                                       self.scheduler.schedule(self._reg_id, timeout=timeout)
+                                       self._wait_loop(timeout=self._cancel_timeout)
                                        if self._registered:
                                                self._orphan_process_warn()
                        else:
-                               while self._registered:
-                                       self.scheduler.iteration()
+                               self._wait_loop()
                        self._unregister()
                        if self.returncode is not None:
                                return self.returncode