diff options
author | Benjamin Schubert <contact@benschubert.me> | 2019-07-26 14:47:08 +0100 |
---|---|---|
committer | Benjamin Schubert <contact@benschubert.me> | 2019-07-29 10:42:02 +0100 |
commit | 90da23867767905c39bf8199c2b8a4d6e13a5c95 (patch) | |
tree | 44f658016a1176a7985681421cc76fbcc671a323 /src/buildstream/_scheduler/jobs/job.py | |
parent | 7736e44adb29688c13da1f4c5bddf03bd878a0f3 (diff) | |
download | buildstream-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.py | 18 |
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() # |