summaryrefslogtreecommitdiff
path: root/buildstream/_scheduler/queue.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildstream/_scheduler/queue.py')
-rw-r--r--buildstream/_scheduler/queue.py47
1 files changed, 24 insertions, 23 deletions
diff --git a/buildstream/_scheduler/queue.py b/buildstream/_scheduler/queue.py
index 4642edaa7..46640677f 100644
--- a/buildstream/_scheduler/queue.py
+++ b/buildstream/_scheduler/queue.py
@@ -21,6 +21,7 @@
# System imports
from collections import deque
+from enum import Enum
# Local imports
from .job import Job
@@ -40,6 +41,20 @@ class QueueType():
PUSH = 3
+# Queue status for a given element
+#
+#
+class QueueStatus(Enum):
+ # The element is waiting for dependencies.
+ WAIT = 1
+
+ # The element can skip this queue.
+ SKIP = 2
+
+ # The element is ready for processing in this queue.
+ READY = 3
+
+
# Queue()
#
#
@@ -89,33 +104,18 @@ class Queue():
def process(self, element):
pass
- # ready()
- #
- # Abstract method for reporting whether an element
- # is ready for processing in this queue or not.
- #
- # Args:
- # element (Element): An element to process
- #
- # Returns:
- # (bool): Whether the element is ready for processing
- #
- def ready(self, element):
- return True
-
- # skip()
+ # status()
#
- # Abstract method for reporting whether an element
- # can be skipped for this phase.
+ # Abstract method for reporting the status of an element.
#
# Args:
# element (Element): An element to process
#
# Returns:
- # (bool): Whether the element can be skipped
+ # (QueueStatus): The element status
#
- def skip(self, element):
- return False
+ def status(self, element):
+ return QueueStatus.READY
# done()
#
@@ -149,7 +149,7 @@ class Queue():
# Place skipped elements directly on the done queue
elts = list(elts)
- skip = [elt for elt in elts if self.skip(elt)]
+ skip = [elt for elt in elts if self.status(elt) == QueueStatus.SKIP]
wait = [elt for elt in elts if elt not in skip]
self.wait_queue.extend(wait)
@@ -167,11 +167,12 @@ class Queue():
while len(self.wait_queue) > 0 and scheduler.get_job_token(self.queue_type):
element = self.wait_queue.popleft()
- if not self.ready(element):
+ status = self.status(element)
+ if status == QueueStatus.WAIT:
scheduler.put_job_token(self.queue_type)
unready.append(element)
continue
- elif self.skip(element):
+ elif status == QueueStatus.SKIP:
scheduler.put_job_token(self.queue_type)
self.done_queue.append(element)
self.skipped_elements.append(element)