repository.py

changeset 64
6cfe6a89e810
parent 54
cfcaa5f6ba33
child 74
4f56142e7497
--- a/repository.py	Wed Jan 24 22:23:51 2018 +0000
+++ b/repository.py	Thu Jan 25 22:34:55 2018 +0000
@@ -3,15 +3,18 @@
 #
 
 import weakref
+import borgend
 from scheduler import QueueThread, QueuedEvent
 
+logger=borgend.logger.getChild(__name__)
+
 class FIFOEvent(QueuedEvent):
     def __init__(self, cond, name=None):
         self._goodtogo=False
         super().__init__(cond, name=name)
 
     def __lt__(self, other):
-        return True
+        return False
 
 class FIFO(QueueThread):
     def __init__(self, **kwargs):
@@ -24,8 +27,9 @@
                 if ev:
                     # We can only remove ev from the list when ev.cond allows
                     with ev.cond:
-                        ev._goodtogo=True
-                        ev.cond.notifyAll()
+                        if not ev._goodtogo:
+                            ev._goodtogo=True
+                            ev.cond.notifyAll()
                 self._cond.wait()
 
             # Termination cleanup
@@ -43,19 +47,22 @@
         with self._cond:
             self._insert(ev)
 
-        goodtogo=False
-        terminate_=False
-        while not goodtogo and not terminate_:
-            # This will release the lock on cond, allowing queue manager (scheduler)
-            # thread to notify us if we are already to be released
-            ev.cond.wait()
-            with ev.cond:
-                goodtogo=ev._goodtogo
-            with self._cond:
-                terminate_=self._terminate
+        # This will release the lock on cond, allowing queue manager (scheduler)
+        # thread to notify us if we are already to be released
+        logger.debug("%s:Queuing %s", self.name, ev.name or 'UNKNOWN')
+        ev.cond.wait()
 
         try:
-            if not terminate_:
+            if ev._goodtogo:
+                logger.debug("%s:Executing %s", self.name, ev.name or 'UNKNOWN')
+                #
+                # TODO: action() has to unlink on finish; so should maybe
+                # use weak references to event.
+                # Or we have to make action take all the time, so make the
+                # stdout thread.
+                # OR: Easiest to just move finish-waiting into __launch_check
+                # instead of at the outer level of the main loop.
+                #
                 action()
         finally:
             with self._cond:
@@ -63,6 +70,8 @@
                 # Let _fifo_thread proceed to next action
                 self._cond.notify()
 
+        return ev._goodtogo
+
 class Repository(FIFO):
     def __init__(self, name):
         super().__init__(name = 'RepositoryThread %s' % name)

mercurial