summaryrefslogtreecommitdiff
path: root/src/buildstream/_scheduler/jobs/job.py
diff options
context:
space:
mode:
authorBenjamin Schubert <contact@benschubert.me>2019-07-26 14:47:08 +0100
committerBenjamin Schubert <contact@benschubert.me>2019-07-29 10:42:02 +0100
commit90da23867767905c39bf8199c2b8a4d6e13a5c95 (patch)
tree44f658016a1176a7985681421cc76fbcc671a323 /src/buildstream/_scheduler/jobs/job.py
parent7736e44adb29688c13da1f4c5bddf03bd878a0f3 (diff)
downloadbuildstream-90da23867767905c39bf8199c2b8a4d6e13a5c95.tar.gz
types: Add a 'FastEnum' implementation and replace Enum by it
'Enum' has a big performance impact on the running code. Replacing it with a safe subset of functionality removes lots of this overhead without removing the benefits of using enums (safe comparisions, uniqueness)
Diffstat (limited to 'src/buildstream/_scheduler/jobs/job.py')
-rw-r--r--src/buildstream/_scheduler/jobs/job.py18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/buildstream/_scheduler/jobs/job.py b/src/buildstream/_scheduler/jobs/job.py
index 7975488ed..c651d5206 100644
--- a/src/buildstream/_scheduler/jobs/job.py
+++ b/src/buildstream/_scheduler/jobs/job.py
@@ -20,7 +20,6 @@
# Tristan Maat <tristan.maat@codethink.co.uk>
# System imports
-import enum
import os
import sys
import signal
@@ -32,6 +31,7 @@ import multiprocessing
# BuildStream toplevel imports
from ..._exceptions import ImplError, BstError, set_last_task_error, SkipJob
from ..._message import Message, MessageType, unconditional_messages
+from ...types import FastEnum
from ... import _signals, utils
from .jobpickler import pickle_child_job
@@ -39,8 +39,7 @@ from .jobpickler import pickle_child_job
# Return code values shutdown of job handling child processes
#
-@enum.unique
-class _ReturnCode(enum.IntEnum):
+class _ReturnCode(FastEnum):
OK = 0
FAIL = 1
PERM_FAIL = 2
@@ -52,8 +51,7 @@ class _ReturnCode(enum.IntEnum):
# The job completion status, passed back through the
# complete callbacks.
#
-@enum.unique
-class JobStatus(enum.Enum):
+class JobStatus(FastEnum):
# Job succeeded
OK = 0
@@ -80,8 +78,7 @@ class Process(multiprocessing.Process):
self._sentinel = self._popen.sentinel
-@enum.unique
-class _MessageType(enum.Enum):
+class _MessageType(FastEnum):
LOG_MESSAGE = 1
ERROR = 2
RESULT = 3
@@ -443,6 +440,11 @@ class Job():
def _parent_child_completed(self, pid, returncode):
self._parent_shutdown()
+ try:
+ returncode = _ReturnCode(returncode)
+ except KeyError: # An unexpected return code was returned, let's fail permanently
+ returncode = _ReturnCode.PERM_FAIL
+
# We don't want to retry if we got OK or a permanent fail.
retry_flag = returncode == _ReturnCode.FAIL
@@ -834,7 +836,7 @@ class ChildJob():
def _child_shutdown(self, exit_code):
self._queue.close()
assert isinstance(exit_code, _ReturnCode)
- sys.exit(int(exit_code))
+ sys.exit(exit_code.value)
# _child_message_handler()
#