diff options
| author | Steven Knight <knight@baldmt.com> | 2002-02-18 22:34:59 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2002-02-18 22:34:59 (GMT) |
| commit | 2db9879e1b4671c412b50a8a3c67eda1c6c95d93 (patch) | |
| tree | 7d249871746d7775d3da397778778f0ffbea3308 /src/engine | |
| parent | c71fa63caaa49aeeb7753a28a630d0d8de7e5606 (diff) | |
| download | SCons-2db9879e1b4671c412b50a8a3c67eda1c6c95d93.zip SCons-2db9879e1b4671c412b50a8a3c67eda1c6c95d93.tar.gz SCons-2db9879e1b4671c412b50a8a3c67eda1c6c95d93.tar.bz2 | |
Efficiency: On the Taskmaster's Walker's out-of-date checks, don't return any children if the node itself has already been visited.
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/SCons/Taskmaster.py | 4 | ||||
| -rw-r--r-- | src/engine/SCons/TaskmasterTests.py | 33 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py index 558845d..cdee378 100644 --- a/src/engine/SCons/Taskmaster.py +++ b/src/engine/SCons/Taskmaster.py @@ -166,6 +166,10 @@ class Taskmaster: def __init__(self, targets=[], tasker=Task, calc=Calc()): def out_of_date(node): + if node.get_state(): + # The state is set, so someone has already been here + # (finished or currently executing). Find another one. + return [] # Scan the file before fetching its children(). node.scan() return filter(lambda x: x.get_state() != SCons.Node.up_to_date, diff --git a/src/engine/SCons/TaskmasterTests.py b/src/engine/SCons/TaskmasterTests.py index 0d7a7ad..32a1110 100644 --- a/src/engine/SCons/TaskmasterTests.py +++ b/src/engine/SCons/TaskmasterTests.py @@ -32,6 +32,7 @@ import SCons.Errors built = None executed = None +scan_called = 0 class Node: def __init__(self, name, kids = [], scans = []): @@ -58,6 +59,8 @@ class Node: return self.kids def scan(self): + global scan_called + scan_called = scan_called + 1 self.kids = self.kids + self.scans for scan in self.scans: scan.parents.append(self) @@ -240,6 +243,36 @@ class TaskmasterTestCase(unittest.TestCase): assert t.get_target() == n3 t.executed() assert tm.next_task() == None + + n1 = Node("n1") + n2 = Node("n2") + n3 = Node("n3", [n1, n2]) + n4 = Node("n4", [n3]) + n5 = Node("n5", [n3]) + global scan_called + scan_called = 0 + tm = SCons.Taskmaster.Taskmaster([n4]) + t = tm.next_task() + assert t.get_target() == n1 + t.executed() + t = tm.next_task() + assert t.get_target() == n2 + t.executed() + t = tm.next_task() + assert t.get_target() == n3 + t.executed() + t = tm.next_task() + assert t.get_target() == n4 + t.executed() + assert tm.next_task() == None + assert scan_called == 4, scan_called + + tm = SCons.Taskmaster.Taskmaster([n5]) + t = tm.next_task() + assert t.get_target() == n5, t.get_target() + t.executed() + assert tm.next_task() == None + assert scan_called == 5, scan_called def test_cycle_detection(self): n1 = Node("n1") |
