Index: gclient_utils.py |
diff --git a/gclient_utils.py b/gclient_utils.py |
index 89050b7add1469f184c83b1c636910e7aa88a04f..2402519a3351d6011dc1252f7d8922e7192f0cf5 100644 |
--- a/gclient_utils.py |
+++ b/gclient_utils.py |
@@ -456,19 +456,45 @@ def GetGClientRootAndEntries(path=None): |
return config_dir, env['entries'] |
+def lockedmethod(method): |
+ """Method decorator that holds self.lock for the duration of the call.""" |
+ def inner(self, *args, **kwargs): |
+ try: |
+ try: |
+ self.lock.acquire() |
+ except KeyboardInterrupt: |
+ print >> sys.stderr, 'Was deadlocked' |
+ raise |
+ return method(self, *args, **kwargs) |
+ finally: |
+ self.lock.release() |
+ return inner |
+ |
+ |
class WorkItem(object): |
"""One work item.""" |
- def __init__(self): |
+ def __init__(self, name): |
# A list of string, each being a WorkItem name. |
- self.requirements = [] |
+ self._requirements = set() |
# A unique string representing this work item. |
- self.name = None |
+ self._name = name |
+ self.lock = threading.RLock() |
+ @lockedmethod |
def run(self, work_queue): |
"""work_queue is passed as keyword argument so it should be |
the last parameters of the function when you override it.""" |
pass |
+ @property |
+ def name(self): |
+ return self._name |
+ |
+ @property |
+ @lockedmethod |
+ def requirements(self): |
+ return tuple(self._requirements) |
+ |
class ExecutionQueue(object): |
"""Runs a set of WorkItem that have interdependencies and were WorkItem are |