summaryrefslogtreecommitdiff
path: root/third_party/waf/waflib/Runner.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/waf/waflib/Runner.py')
-rw-r--r--third_party/waf/waflib/Runner.py49
1 files changed, 38 insertions, 11 deletions
diff --git a/third_party/waf/waflib/Runner.py b/third_party/waf/waflib/Runner.py
index 30e42d3b099..7535c83de9e 100644
--- a/third_party/waf/waflib/Runner.py
+++ b/third_party/waf/waflib/Runner.py
@@ -1,7 +1,3 @@
-#! /usr/bin/env python
-# encoding: utf-8
-# WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
-
#!/usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2005-2018 (ita)
@@ -12,9 +8,21 @@ Runner.py: Task scheduling and execution
import heapq, traceback
try:
- from queue import Queue
+ from queue import Queue, PriorityQueue
except ImportError:
from Queue import Queue
+ try:
+ from Queue import PriorityQueue
+ except ImportError:
+ class PriorityQueue(Queue):
+ def _init(self, maxsize):
+ self.maxsize = maxsize
+ self.queue = []
+ def _put(self, item):
+ heapq.heappush(self.queue, item)
+ def _get(self):
+ return heapq.heappop(self.queue)
+
from waflib import Utils, Task, Errors, Logs
GAP = 5
@@ -34,6 +42,7 @@ class PriorityTasks(object):
def append(self, task):
heapq.heappush(self.lst, task)
def appendleft(self, task):
+ "Deprecated, do not use"
heapq.heappush(self.lst, task)
def pop(self):
return heapq.heappop(self.lst)
@@ -141,7 +150,7 @@ class Parallel(object):
self.incomplete = set()
"""List of :py:class:`waflib.Task.Task` waiting for dependent tasks to complete (DAG)"""
- self.ready = Queue(0)
+ self.ready = PriorityQueue(0)
"""List of :py:class:`waflib.Task.Task` ready to be executed by consumers"""
self.out = Queue(0)
@@ -261,7 +270,26 @@ class Parallel(object):
:type tsk: :py:attr:`waflib.Task.Task`
"""
if getattr(tsk, 'more_tasks', None):
- # TODO recompute priorities globally?
+ more = set(tsk.more_tasks)
+ groups_done = set()
+ def iteri(a, b):
+ for x in a:
+ yield x
+ for x in b:
+ yield x
+
+ # Update the dependency tree
+ # this assumes that task.run_after values were updated
+ for x in iteri(self.outstanding, self.incomplete):
+ for k in x.run_after:
+ if isinstance(k, Task.TaskGroup):
+ if k not in groups_done:
+ groups_done.add(k)
+ for j in k.prev & more:
+ self.revdeps[j].add(k)
+ elif k in more:
+ self.revdeps[k].add(x)
+
ready, waiting = self.prio_and_split(tsk.more_tasks)
self.outstanding.extend(ready)
self.incomplete.update(waiting)
@@ -480,13 +508,12 @@ class Parallel(object):
reverse = self.revdeps
+ groups_done = set()
for x in tasks:
for k in x.run_after:
if isinstance(k, Task.TaskGroup):
- if k.done:
- pass
- else:
- k.done = True
+ if k not in groups_done:
+ groups_done.add(k)
for j in k.prev:
reverse[j].add(k)
else: