|
|
Go to the documentation of this file. 1 #ifndef FWCore_Framework_Worker_h
2 #define FWCore_Framework_Worker_h
69 #include <unordered_map>
75 class ModuleProcessName;
76 class ProductResolverIndexHelper;
77 class ProductResolverIndexAndSkipBit;
80 class ProductRegistry;
81 class ThinnedAssociationsHelper;
83 namespace workerhelper {
87 namespace eventsetup {
107 void push(tbb::task_group& iG,
F&& iF) {
145 template <
typename T>
147 typename T::TransitionInfoType
const&,
151 typename T::Context
const*);
153 template <
typename T>
155 typename T::TransitionInfoType
const&,
159 typename T::Context
const*);
161 template <
typename T>
165 typename T::Context
const*);
206 std::unordered_multimap<
std::string, std::tuple<TypeID const*, const char*, edm::ProductResolverIndex>>
const&
211 std::vector<ModuleProcessName>& modulesInPreviousProcesses,
213 std::map<std::string, ModuleDescription const*>
const& labelsToDesc)
const = 0;
217 virtual std::vector<ConsumesInfo>
consumesInfo()
const = 0;
223 timesRun_.store(0, std::memory_order_release);
244 template <
typename O>
281 template <
typename T>
309 template <
bool IS_EVENT>
318 template <
bool IS_EVENT>
327 template <
bool IS_EVENT>
337 template <
typename T>
341 typename T::TransitionInfoType
const&,
357 template <
typename T>
359 typename T::TransitionInfoType
const&,
362 typename T::Context
const*);
373 template <
typename T>
377 typename T::TransitionInfoType
const& transitionInfo,
381 typename T::Context
const*
context,
382 tbb::task_group* iGroup)
411 std::exception_ptr temp_excptr;
413 if constexpr (T::isEvent_) {
420 temp_excptr = std::current_exception();
422 excptr = &temp_excptr;
443 std::exception_ptr* ptr =
nullptr;
444 worker->template runModuleAfterAsyncPrefetch<T>(ptr,
info, streamID, parentContext, sContext);
477 template <
typename T,
typename DUMMY =
void>
481 typename T::TransitionInfoType
const&,
488 template <
typename DUMMY>
497 m_eventTransitionInfo(eventTransitionInfo),
498 m_parentContext(parentContext),
500 m_serviceToken(
token) {}
508 std::exception_ptr temp_excptr;
513 m_worker->emitPostModuleEventPrefetchingSignal();
515 temp_excptr = std::current_exception();
517 excptr = &temp_excptr;
522 if (
auto queue = m_worker->serializeRunModule()) {
523 queue.push(*m_holder.group(),
525 info = m_eventTransitionInfo,
526 parentContext = m_parentContext,
527 serviceToken = m_serviceToken,
528 holder = m_holder]() {
532 std::exception_ptr* ptr =
nullptr;
533 worker->runAcquireAfterAsyncPrefetch(ptr,
info, parentContext, holder);
539 m_worker->runAcquireAfterAsyncPrefetch(excptr, m_eventTransitionInfo, m_parentContext,
std::move(m_holder));
556 tbb::task_group*
group,
594 template <
typename T>
595 class ModuleSignalSentry {
598 typename T::Context
const*
context,
600 : a_(
a), context_(
context), moduleCallingContext_(moduleCallingContext) {
602 T::preModuleSignal(a_,
context, moduleCallingContext_);
605 ~ModuleSignalSentry() {
607 T::postModuleSignal(a_, context_, moduleCallingContext_);
612 typename T::Context
const* context_;
618 namespace workerhelper {
656 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
681 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
706 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
731 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
757 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
782 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
808 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
833 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
858 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
878 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
898 ModuleSignalSentry<Arg> cpp(actReg,
context, mcc);
910 template <
typename T>
914 typename T::TransitionInfoType
const& transitionInfo,
916 Principal const& principal = transitionInfo.principal();
932 template <
typename T>
934 typename T::TransitionInfoType
const& transitionInfo,
938 typename T::Context
const*
context) {
944 bool expected =
false;
945 bool workStarted =
workStarted_.compare_exchange_strong(expected,
true);
948 if constexpr (T::isEvent_) {
967 auto p = m_task.exchange(
nullptr);
976 std::atomic<edm::WaitingTask*> m_task;
978 if constexpr (T::isEvent_) {
980 auto ownRunTask = std::make_shared<DestroyTask>(moduleTask);
984 [
this, weakToken, transitionInfo, parentContext, ownRunTask,
group](std::exception_ptr
const* iExcept) {
993 auto ownModuleTask = std::make_shared<DestroyTask>(moduleTask);
997 std::exception_ptr
const*)
mutable {
1010 if constexpr (T::isEvent_) {
1022 template <
typename T>
1024 typename T::TransitionInfoType
const& transitionInfo,
1027 typename T::Context
const*
context) {
1028 std::exception_ptr exceptionPtr;
1032 exceptionPtr = *iEPtr;
1033 setException<T::isEvent_>(exceptionPtr);
1035 setPassed<T::isEvent_>();
1040 CMS_SA_ALLOW try { runModule<T>(transitionInfo, streamID, parentContext,
context); }
catch (...) {
1041 exceptionPtr = std::current_exception();
1045 return exceptionPtr;
1048 template <
typename T>
1050 typename T::TransitionInfoType
const& transitionInfo,
1054 typename T::Context
const*
context) {
1060 bool expected =
false;
1061 auto workStarted =
workStarted_.compare_exchange_strong(expected,
true);
1066 auto toDo = [
this,
info = transitionInfo, streamID, parentContext,
context, weakToken]() {
1067 std::exception_ptr exceptionPtr;
1073 this->runModule<T>(
info, streamID, parentContext,
context);
1075 exceptionPtr = std::current_exception();
1082 auto afterPrefetch =
1095 WaitingTaskHolder(*
group, afterPrefetch), transitionInfo.eventSetupImpl(), T::transition_, serviceToken);
1107 template <
typename T>
1111 typename T::Context
const*
context) {
1117 if constexpr (T::isEvent_) {
1118 timesRun_.fetch_add(1, std::memory_order_relaxed);
1128 setPassed<T::isEvent_>();
1130 setFailed<T::isEvent_>();
1137 setException<T::isEvent_>(std::current_exception());
1140 rc = setPassed<T::isEvent_>();
1147 template <
typename T>
1151 typename T::Context
const*
context) {
1153 std::exception_ptr
const* prefetchingException =
nullptr;
1154 return runModuleAfterAsyncPrefetch<T>(prefetchingException, transitionInfo, streamID, parentContext,
context);
EnableQueueGuard & operator=(EnableQueueGuard const &)=delete
static bool wantsTransition(Worker const *iWorker)
virtual std::vector< ConsumesInfo > consumesInfo() const =0
static bool call(Worker *iWorker, StreamID id, RunTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
virtual void itemsToGetForSelection(std::vector< ProductResolverIndexAndSkipBit > &) const =0
static bool call(Worker *iWorker, StreamID id, LumiTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
virtual bool implDoPrePrefetchSelection(StreamID, EventPrincipal const &, ModuleCallingContext const *)=0
OccurrenceTraits< RunPrincipal, BranchActionGlobalEnd > Arg
virtual void itemsMayGet(BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const =0
virtual bool implDoAccessInputProcessBlock(ProcessBlockPrincipal const &, ModuleCallingContext const *)=0
virtual void selectInputProcessBlocks(ProductRegistry const &, ProcessBlockHelperBase const &)=0
static SerialTaskQueue * enableGlobalQueue(Worker *)
OccurrenceTraits< EventPrincipal, BranchActionStreamBegin > Arg
static SerialTaskQueue * enableGlobalQueue(Worker *)
bool runModule(typename T::TransitionInfoType const &, StreamID, ParentContext const &, typename T::Context const *)
std::shared_ptr< ActivityRegistry > actReg_
virtual bool wantsGlobalRuns() const =0
virtual void implEndJob()=0
virtual void convertCurrentProcessAlias(std::string const &processName)=0
static bool needToRunSelection(Worker const *iWorker)
std::atomic< int > timesPassed_
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, LumiTransitionInfo const &info, Transition transition)
LimitedTaskQueue * limited_
std::exception_ptr runModuleDirectly(typename T::TransitionInfoType const &, StreamID, ParentContext const &, typename T::Context const *)
bool resume()
Resumes processing if the queue was paused.
std::atomic< int > timesVisited_
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
virtual bool wantsGlobalLuminosityBlocks() const =0
void resetModuleDescription(ModuleDescription const *)
virtual bool wantsInputProcessBlocks() const =0
void postDoEvent(EventPrincipal const &)
ExceptionToActionTable const * actions_
virtual void implBeginJob()=0
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, LumiTransitionInfo const &info, Transition transition)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
uint32_t const T *__restrict__ const uint32_t *__restrict__ int32_t int Histo::index_type cudaStream_t stream
void respondToCloseOutputFile()
HandleExternalWorkExceptionTask(Worker *worker, tbb::task_group *group, WaitingTask *runModuleTask, ParentContext const &parentContext)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
Worker(ModuleDescription const &iMD, ExceptionToActionTable const *iActions)
RunModuleTask(Worker *worker, typename T::TransitionInfoType const &transitionInfo, ServiceToken const &token, StreamID streamID, ParentContext const &parentContext, typename T::Context const *context, tbb::task_group *iGroup)
void respondToOpenInputFile(FileBlock const &fb)
std::exception_ptr setException(std::exception_ptr iException)
virtual void itemsToGet(BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const =0
std::atomic< int > numberOfPathsLeftToRun_
void registerThinnedAssociations(ProductRegistry const ®istry, ThinnedAssociationsHelper &helper)
static SerialTaskQueue * enableGlobalQueue(Worker *)
static bool call(Worker *iWorker, StreamID, LumiTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, RunTransitionInfo const &info, Transition transition)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
ModuleDescription const * moduleDescription() const
const ParentContext m_parentContext
virtual bool implDoBegin(RunTransitionInfo const &, ModuleCallingContext const *)=0
ServiceWeakToken m_serviceToken
OccurrenceTraits< RunPrincipal, BranchActionStreamBegin > Arg
static bool needToRunSelection(Worker const *iWorker)
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, LumiTransitionInfo const &info, Transition transition)
virtual bool wantsStreamLuminosityBlocks() const =0
static bool wantsTransition(Worker const *iWorker)
static bool needToRunSelection(Worker const *iWorker)
virtual void implEndStream(StreamID)=0
static void esPrefetchAsync(Worker *, WaitingTaskHolder, ServiceToken const &, ProcessBlockTransitionInfo const &, Transition)
std::atomic< bool > workStarted_
virtual std::vector< ProductResolverIndex > const & itemsShouldPutInEvent() const =0
virtual ConcurrencyTypes moduleConcurrencyType() const =0
static SerialTaskQueue * enableGlobalQueue(Worker *)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
Worker & operator=(Worker const &)=delete
void reset()
Resets access to the resource so that added tasks will wait.
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
virtual void implRespondToCloseInputFile(FileBlock const &fb)=0
static SerialTaskQueue * enableGlobalQueue(Worker *)
static bool wantsTransition(Worker const *iWorker)
ModuleDescription const * description() const
virtual bool implDoStreamEnd(StreamID, RunTransitionInfo const &, ModuleCallingContext const *)=0
void doWorkAsync(WaitingTaskHolder, typename T::TransitionInfoType const &, ServiceToken const &, StreamID, ParentContext const &, typename T::Context const *)
void runAcquireAfterAsyncPrefetch(std::exception_ptr const *, EventTransitionInfo const &, ParentContext const &, WaitingTaskWithArenaHolder)
virtual bool implDoBeginProcessBlock(ProcessBlockPrincipal const &, ModuleCallingContext const *)=0
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
std::exception_ptr const * exceptionPtr() const
Returns exception thrown by dependent task.
static bool needToRunSelection(Worker const *iWorker)
edm::propagate_const< EarlyDeleteHelper * > earlyDeleteHelper_
void setActivityRegistry(std::shared_ptr< ActivityRegistry > areg)
static bool needToRunSelection(Worker const *iWorker)
std::atomic< int > timesRun_
static bool needToRunSelection(Worker const *iWorker)
AcquireTask(Worker *, typename T::TransitionInfoType const &, ServiceToken const &, ParentContext const &, WaitingTaskWithArenaHolder)
virtual void resolvePutIndicies(BranchType iBranchType, std::unordered_multimap< std::string, std::tuple< TypeID const *, const char *, edm::ProductResolverIndex >> const &iIndicies)=0
static bool wantsTransition(Worker const *iWorker)
auto wrap(F iFunc) -> decltype(iFunc())
static bool wantsTransition(Worker const *iWorker)
std::atomic< State > state_
BranchType const & branchType() const
void doneWaiting(std::exception_ptr iPtr)
Signals that the resource is now available and tasks should be spawned.
virtual void doClearModule()=0
const ParentContext m_parentContext
OccurrenceTraits< RunPrincipal, BranchActionStreamEnd > Arg
static bool needToRunSelection(Worker const *iWorker)
AcquireTask(Worker *worker, EventTransitionInfo const &eventTransitionInfo, ServiceToken const &token, ParentContext const &parentContext, WaitingTaskWithArenaHolder holder)
static bool needToRunSelection(Worker const *iWorker)
static void esPrefetchAsync(Worker *, WaitingTaskHolder, ServiceToken const &, ProcessBlockTransitionInfo const &, Transition)
static bool call(Worker *iWorker, StreamID, EventTransitionInfo const &info, ActivityRegistry *, ModuleCallingContext const *mcc, Arg::Context const *)
static bool call(Worker *iWorker, StreamID, ProcessBlockTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
std::atomic< int > timesExcept_
void push(tbb::task_group &iG, F &&iF)
virtual bool implDoEnd(RunTransitionInfo const &, ModuleCallingContext const *)=0
static bool needToRunSelection(Worker const *iWorker)
const ParentContext m_parentContext
static bool call(Worker *iWorker, StreamID id, LumiTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
static bool needToRunSelection(Worker const *iWorker)
static bool wantsTransition(Worker const *iWorker)
void push(tbb::task_group &iGroup, T &&iAction)
asynchronously pushes functor iAction into queue
void runAcquire(EventTransitionInfo const &, ParentContext const &, WaitingTaskWithArenaHolder &)
void doWorkNoPrefetchingAsync(WaitingTaskHolder, typename T::TransitionInfoType const &, ServiceToken const &, StreamID, ParentContext const &, typename T::Context const *)
virtual TaskQueueAdaptor serializeRunModule()=0
virtual void implDoAcquire(EventTransitionInfo const &, ModuleCallingContext const *, WaitingTaskWithArenaHolder &)=0
static bool wantsTransition(Worker const *iWorker)
virtual bool wantsProcessBlocks() const =0
static SerialTaskQueue * enableGlobalQueue(Worker *iWorker)
edm::WaitingTaskList waitingTasks_
static bool call(Worker *iWorker, StreamID, LumiTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
FunctorWaitingTask< F > * make_waiting_task(F f)
tbb::task_group * m_group
virtual void implRegisterThinnedAssociations(ProductRegistry const &, ThinnedAssociationsHelper &)=0
StreamContext const * getStreamContext() const
T::TransitionInfoType m_transitionInfo
static SerialTaskQueue * pauseGlobalQueue(Worker *)
WaitingTask * m_runModuleTask
static bool wantsTransition(Worker const *iWorker)
static SerialTaskQueue * enableGlobalQueue(Worker *)
void setContext(State state, ParentContext const &parent, ModuleCallingContext const *previousOnThread)
void setEarlyDeleteHelper(EarlyDeleteHelper *iHelper)
bool ranAcquireWithoutException_
static void exceptionContext(cms::Exception &ex, ModuleCallingContext const *mcc)
virtual void implRespondToOpenInputFile(FileBlock const &fb)=0
void push(tbb::task_group &iGroup, T &&iAction)
asynchronously pushes functor iAction into queue
TaskQueueAdaptor()=default
ModuleCallingContext moduleCallingContext_
static void esPrefetchAsync(Worker *, WaitingTaskHolder, ServiceToken const &, ProcessBlockTransitionInfo const &, Transition)
OccurrenceTraits< RunPrincipal, BranchActionGlobalBegin > Arg
ServiceToken lock() const
void respondToCloseInputFile(FileBlock const &fb)
static SerialTaskQueue * enableGlobalQueue(Worker *)
void callWhenDoneAsync(WaitingTaskHolder task)
std::atomic< int > timesFailed_
static bool needToRunSelection(Worker const *iWorker)
static bool wantsTransition(Worker const *iWorker)
void esPrefetchAsync(WaitingTaskHolder, EventSetupImpl const &, Transition, ServiceToken const &)
virtual bool implDo(EventTransitionInfo const &, ModuleCallingContext const *)=0
std::exception_ptr cached_exception_
tbb::task_group * m_group
bool needsESPrefetching(Transition iTrans) const noexcept
virtual std::vector< ESRecordIndex > const & esRecordsToGetFrom(Transition) const =0
virtual Types moduleType() const =0
std::exception_ptr runModuleAfterAsyncPrefetch(std::exception_ptr const *, typename T::TransitionInfoType const &, StreamID, ParentContext const &, typename T::Context const *)
EnableQueueGuard(EnableQueueGuard &&iGuard)
virtual bool wantsStreamRuns() const =0
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, EventTransitionInfo const &info, Transition transition)
virtual std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom(BranchType) const =0
virtual bool hasAcquire() const =0
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
static bool wantsTransition(Worker const *iWorker)
void add(tbb::task_group *, WaitingTask *)
Adds task to the waiting list.
virtual void implRespondToCloseOutputFile()=0
static bool call(Worker *iWorker, StreamID, ProcessBlockTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
virtual SerialTaskQueue * globalRunsQueue()=0
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, RunTransitionInfo const &info, Transition transition)
static SerialTaskQueue * enableGlobalQueue(Worker *)
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, RunTransitionInfo const &info, Transition transition)
void prefetchAsync(WaitingTaskHolder, ServiceToken const &, ParentContext const &, typename T::TransitionInfoType const &, Transition)
static bool call(Worker *iWorker, StreamID id, RunTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
static bool call(Worker *iWorker, StreamID, RunTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
static SerialTaskQueue * enableGlobalQueue(Worker *)
virtual void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const &)=0
TaskQueueAdaptor(SerialTaskQueueChain *iChain)
virtual bool hasAccumulator() const =0
virtual void preActionBeforeRunEventAsync(WaitingTaskHolder iTask, ModuleCallingContext const &moduleCallingContext, Principal const &iPrincipal) const =0
void skipOnPath(EventPrincipal const &iEvent)
ActivityRegistry * activityRegistry()
virtual void modulesWhoseProductsAreConsumed(std::array< std::vector< ModuleDescription const * > *, NumBranchTypes > &modules, std::vector< ModuleProcessName > &modulesInPreviousProcesses, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc) const =0
EnableQueueGuard(SerialTaskQueue *iQueue)
void edPrefetchAsync(WaitingTaskHolder, ServiceToken const &, Principal const &) const
static SerialTaskQueue * enableGlobalQueue(Worker *iWorker)
virtual std::vector< ESProxyIndex > const & esItemsToGetFrom(Transition) const =0
SerialTaskQueueChain * serial_
void prePrefetchSelectionAsync(tbb::task_group &, WaitingTask *task, ServiceToken const &, StreamID stream, EventPrincipal const *)
virtual SerialTaskQueue * globalLuminosityBlocksQueue()=0
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
std::exception_ptr handleExternalWorkException(std::exception_ptr const *iEPtr, ParentContext const &parentContext)
virtual void implBeginStream(StreamID)=0
T::Context const * m_context
static bool call(Worker *iWorker, StreamID, RunTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
void emitPostModuleEventPrefetchingSignal()
static SerialTaskQueue * enableGlobalQueue(Worker *)
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, RunTransitionInfo const &info, Transition transition)
WaitingTaskWithArenaHolder m_holder
void prePrefetchSelectionAsync(tbb::task_group &, WaitingTask *task, ServiceToken const &, StreamID stream, void const *)
static bool needToRunSelection(Worker const *iWorker)
static bool wantsTransition(Worker const *iWorker)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
EventTransitionInfo m_eventTransitionInfo
#define CMS_THREAD_GUARD(_var_)
static void esPrefetchAsync(Worker *worker, WaitingTaskHolder waitingTask, ServiceToken const &token, LumiTransitionInfo const &info, Transition transition)
static bool wantsTransition(Worker const *iWorker)
static SerialTaskQueue * pauseGlobalQueue(Worker *iWorker)
void beginStream(StreamID id, StreamContext &streamContext)
virtual bool implNeedToRunSelection() const =0
virtual bool implDoStreamBegin(StreamID, RunTransitionInfo const &, ModuleCallingContext const *)=0
ServiceWeakToken m_serviceToken
void endStream(StreamID id, StreamContext &streamContext)
virtual std::string workerType() const =0
virtual bool implDoEndProcessBlock(ProcessBlockPrincipal const &, ModuleCallingContext const *)=0
TaskQueueAdaptor(LimitedTaskQueue *iLimited)
bool shouldRethrowException(std::exception_ptr iPtr, ParentContext const &parentContext, bool isEvent) const
static bool call(Worker *iWorker, StreamID, ProcessBlockTransitionInfo const &info, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)