Commit adcf5b70 authored by maruel@chromium.org's avatar maruel@chromium.org

Revert "Initial step into making Dependency thread safe"

Broke the tree. :(

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@101136 0039d316-1c4b-4281-b951-d872f2087c98
parent 89d51c24
...@@ -145,8 +145,9 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem): ...@@ -145,8 +145,9 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
# self.dependencies and self.requirements are read and modified from # self.dependencies and self.requirements are read and modified from
# multiple threads at the same time. Sad. # multiple threads at the same time. Sad.
GClientKeywords.__init__(self) GClientKeywords.__init__(self)
gclient_utils.WorkItem.__init__(self, name) gclient_utils.WorkItem.__init__(self)
self.parent = parent self.parent = parent
self.name = name
self.url = url self.url = url
self.parsed_url = None self.parsed_url = None
# These 2 are only set in .gclient and not in DEPS files. # These 2 are only set in .gclient and not in DEPS files.
...@@ -168,6 +169,8 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem): ...@@ -168,6 +169,8 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
self.processed = False self.processed = False
# This dependency had its hook run # This dependency had its hook run
self.hooks_ran = False self.hooks_ran = False
# Required dependencies to run before running this one:
self.requirements = set()
# Post process the url to remove trailing slashes. # Post process the url to remove trailing slashes.
if isinstance(self.url, basestring): if isinstance(self.url, basestring):
...@@ -198,7 +201,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem): ...@@ -198,7 +201,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
# self.parent is implicitly a requirement. This will be recursive by # self.parent is implicitly a requirement. This will be recursive by
# definition. # definition.
if self.parent and self.parent.name: if self.parent and self.parent.name:
self._requirements.add(self.parent.name) self.requirements.add(self.parent.name)
# For a tree with at least 2 levels*, the leaf node needs to depend # For a tree with at least 2 levels*, the leaf node needs to depend
# on the level higher up in an orderly way. # on the level higher up in an orderly way.
...@@ -216,10 +219,10 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem): ...@@ -216,10 +219,10 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
for i in range(0, root_deps.index(self.parent)): for i in range(0, root_deps.index(self.parent)):
value = root_deps[i] value = root_deps[i]
if value.name: if value.name:
self._requirements.add(value.name) self.requirements.add(value.name)
if isinstance(self.url, self.FromImpl): if isinstance(self.url, self.FromImpl):
self._requirements.add(self.url.module_name) self.requirements.add(self.url.module_name)
if self.name and self.should_process: if self.name and self.should_process:
def yield_full_tree(root): def yield_full_tree(root):
...@@ -235,7 +238,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem): ...@@ -235,7 +238,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
continue continue
# Step 1: Find any requirements self may need. # Step 1: Find any requirements self may need.
if self.name.startswith(posixpath.join(obj.name, '')): if self.name.startswith(posixpath.join(obj.name, '')):
self._requirements.add(obj.name) self.requirements.add(obj.name)
# Step 2: Find any requirements self may impose. # Step 2: Find any requirements self may impose.
if obj.name.startswith(posixpath.join(self.name, '')): if obj.name.startswith(posixpath.join(self.name, '')):
obj.requirements.add(self.name) obj.requirements.add(self.name)
......
...@@ -456,45 +456,19 @@ def GetGClientRootAndEntries(path=None): ...@@ -456,45 +456,19 @@ def GetGClientRootAndEntries(path=None):
return config_dir, env['entries'] 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): class WorkItem(object):
"""One work item.""" """One work item."""
def __init__(self, name): def __init__(self):
# A list of string, each being a WorkItem name. # A list of string, each being a WorkItem name.
self._requirements = set() self.requirements = []
# A unique string representing this work item. # A unique string representing this work item.
self._name = name self.name = None
self.lock = threading.RLock()
@lockedmethod
def run(self, work_queue): def run(self, work_queue):
"""work_queue is passed as keyword argument so it should be """work_queue is passed as keyword argument so it should be
the last parameters of the function when you override it.""" the last parameters of the function when you override it."""
pass pass
@property
def name(self):
return self._name
@property
@lockedmethod
def requirements(self):
return tuple(self._requirements)
class ExecutionQueue(object): class ExecutionQueue(object):
"""Runs a set of WorkItem that have interdependencies and were WorkItem are """Runs a set of WorkItem that have interdependencies and were WorkItem are
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment