diff options
Diffstat (limited to 'src/buildstream/element.py')
-rw-r--r-- | src/buildstream/element.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/buildstream/element.py b/src/buildstream/element.py index 396a72fb2..efa876c73 100644 --- a/src/buildstream/element.py +++ b/src/buildstream/element.py @@ -240,6 +240,7 @@ class Element(Plugin): self._build_log_path = None # The path of the build log for this Element self.__artifact = None # Artifact class for direct artifact composite interaction self.__strict_artifact = None # Artifact for strict cache key + self.__meta_kind = meta.kind # The kind of this source, required for unpickling # the index of the last source in this element that requires previous # sources for staging @@ -2314,6 +2315,42 @@ class Element(Plugin): rdep.__buildable_callback(rdep) rdep.__buildable_callback = None + # _get_args_for_child_job_pickling(self) + # + # Return data necessary to reconstruct this object in a child job process. + # + # Returns: + # (PluginContext, str, dict): A tuple of (factory, meta_kind, state), + # where `factory` is an object that can use `meta_kind` to create an + # instance of the same type as `self`. `state` is what we want + # `self.__dict__` to be restored to after instantiation in the child + # process. + # + def _get_args_for_child_job_pickling(self): + state = self.__dict__.copy() + + # These are called in the main process to notify the scheduler about + # certain things. They carry a reference to the scheduler, which we + # don't want in the child process, so clear them. + # + # Note that this method of referring to members is error-prone in that + # a later 'search and replace' renaming might miss these. Guard against + # this by making sure we are not creating new members, only clearing + # existing ones. + # + assert "_Element__can_query_cache_callback" in state + state["_Element__can_query_cache_callback"] = None + assert "_Element__buildable_callback" in state + state["_Element__buildable_callback"] = None + + # This callback is not even read in the child process, so delete it. + # If this assumption is invalidated, we will get an attribute error to + # let us know, and we will need to update accordingly. + del state["_Element__required_callback"] + + factory = self._get_project().config.element_factory + return factory, self.__meta_kind, state + ############################################################# # Private Local Methods # ############################################################# |