CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Worker.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_Worker_h
2 #define FWCore_Framework_Worker_h
3 
4 /*----------------------------------------------------------------------
5 
6 Worker: this is a basic scheduling unit - an abstract base class to
7 something that is really a producer or filter.
8 
9 A worker will not actually call through to the module unless it is
10 in a Ready state. After a module is actually run, the state will not
11 be Ready. The Ready state can only be reestablished by doing a reset().
12 
13 Pre/post module signals are posted only in the Ready state.
14 
15 Execution statistics are kept here.
16 
17 If a module has thrown an exception during execution, that exception
18 will be rethrown if the worker is entered again and the state is not Ready.
19 In other words, execution results (status) are cached and reused until
20 the worker is reset().
21 
22 ----------------------------------------------------------------------*/
23 
44 
46 
47 #include <map>
48 #include <memory>
49 #include <sstream>
50 #include <string>
51 #include <vector>
52 
53 namespace edm {
54  class EventPrincipal;
55  class EarlyDeleteHelper;
56  class ProductHolderIndexHelper;
57  class ProductHolderIndexAndSkipBit;
58  class StreamID;
59  class StreamContext;
60  class ProductRegistry;
61  class ThinnedAssociationsHelper;
62 
63  namespace workerhelper {
64  template< typename O> class CallImpl;
65  }
66 
67  class Worker {
68  public:
69  enum State { Ready, Pass, Fail, Exception };
71 
72  Worker(ModuleDescription const& iMD, ExceptionToActionTable const* iActions);
73  virtual ~Worker();
74 
75  Worker(Worker const&) = delete; // Disallow copying and moving
76  Worker& operator=(Worker const&) = delete; // Disallow copying and moving
77 
78  template <typename T>
79  bool doWork(typename T::MyPrincipal&, EventSetup const& c,
81  ParentContext const& parentContext,
82  typename T::Context const* context);
83  void beginJob() ;
84  void endJob();
85  void beginStream(StreamID id, StreamContext& streamContext);
86  void endStream(StreamID id, StreamContext& streamContext);
89 
91  void postForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren) {implPostForkReacquireResources(iChildIndex, iNumberOfChildren);}
93 
94  void reset() { state_ = Ready; }
95 
98 
103  void setActivityRegistry(std::shared_ptr<ActivityRegistry> areg);
104 
106 
107  //Used to make EDGetToken work
108  virtual void updateLookup(BranchType iBranchType,
109  ProductHolderIndexHelper const&) = 0;
110 
111  virtual void modulesDependentUpon(std::vector<const char*>& oModuleLabels) const = 0;
112 
113  virtual void modulesWhoseProductsAreConsumed(std::vector<ModuleDescription const*>& modules,
114  ProductRegistry const& preg,
115  std::map<std::string, ModuleDescription const*> const& labelsToDesc) const = 0;
116 
117  virtual std::vector<ConsumesInfo> consumesInfo() const = 0;
118 
119  virtual Types moduleType() const =0;
120 
121  void clearCounters() {
123  }
124 
125  int timesRun() const { return timesRun_; }
126  int timesVisited() const { return timesVisited_; }
127  int timesPassed() const { return timesPassed_; }
128  int timesFailed() const { return timesFailed_; }
129  int timesExcept() const { return timesExcept_; }
130  State state() const { return state_; }
131 
132  int timesPass() const { return timesPassed(); } // for backward compatibility only - to be removed soon
133 
134  protected:
135  template<typename O> friend class workerhelper::CallImpl;
136  virtual std::string workerType() const = 0;
137  virtual bool implDo(EventPrincipal&, EventSetup const& c,
138  ModuleCallingContext const* mcc) = 0;
139  virtual bool implDoBegin(RunPrincipal& rp, EventSetup const& c,
140  ModuleCallingContext const* mcc) = 0;
141  virtual bool implDoStreamBegin(StreamID id, RunPrincipal& rp, EventSetup const& c,
142  ModuleCallingContext const* mcc) = 0;
143  virtual bool implDoStreamEnd(StreamID id, RunPrincipal& rp, EventSetup const& c,
144  ModuleCallingContext const* mcc) = 0;
145  virtual bool implDoEnd(RunPrincipal& rp, EventSetup const& c,
146  ModuleCallingContext const* mcc) = 0;
147  virtual bool implDoBegin(LuminosityBlockPrincipal& lbp, EventSetup const& c,
148  ModuleCallingContext const* mcc) = 0;
149  virtual bool implDoStreamBegin(StreamID id, LuminosityBlockPrincipal& lbp, EventSetup const& c,
150  ModuleCallingContext const* mcc) = 0;
151  virtual bool implDoStreamEnd(StreamID id, LuminosityBlockPrincipal& lbp, EventSetup const& c,
152  ModuleCallingContext const* mcc) = 0;
153  virtual bool implDoEnd(LuminosityBlockPrincipal& lbp, EventSetup const& c,
154  ModuleCallingContext const* mcc) = 0;
155  virtual void implBeginJob() = 0;
156  virtual void implEndJob() = 0;
157  virtual void implBeginStream(StreamID) = 0;
158  virtual void implEndStream(StreamID) = 0;
159 
161 
163 
164  private:
165 
166  virtual void itemsToGet(BranchType, std::vector<ProductHolderIndexAndSkipBit>&) const = 0;
167  virtual void itemsMayGet(BranchType, std::vector<ProductHolderIndexAndSkipBit>&) const = 0;
168 
169  virtual std::vector<ProductHolderIndexAndSkipBit> const& itemsToGetFromEvent() const = 0;
170 
171  virtual void implRespondToOpenInputFile(FileBlock const& fb) = 0;
172  virtual void implRespondToCloseInputFile(FileBlock const& fb) = 0;
173 
174  virtual void implPreForkReleaseResources() = 0;
175  virtual void implPostForkReacquireResources(unsigned int iChildIndex,
176  unsigned int iNumberOfChildren) = 0;
178 
185 
187 
188  ExceptionToActionTable const* actions_; // memory assumed to be managed elsewhere
189  std::shared_ptr<cms::Exception> cached_exception_; // if state is 'exception'
190 
191  std::shared_ptr<ActivityRegistry> actReg_;
192 
194  };
195 
196  namespace {
197  template <typename T>
198  class ModuleSignalSentry {
199  public:
200  ModuleSignalSentry(ActivityRegistry *a,
201  typename T::Context const* context,
202  ModuleCallingContext const* moduleCallingContext) :
203  a_(a), context_(context), moduleCallingContext_(moduleCallingContext) {
204 
205  if(a_) T::preModuleSignal(a_, context, moduleCallingContext_);
206  }
207 
208  ~ModuleSignalSentry() {
209  if(a_) T::postModuleSignal(a_, context_, moduleCallingContext_);
210  }
211 
212  private:
213  ActivityRegistry* a_;
214  typename T::Context const* context_;
215  ModuleCallingContext const* moduleCallingContext_;
216  };
217 
218  template <typename T>
219  void exceptionContext(typename T::MyPrincipal const& principal,
220  cms::Exception& ex,
221  ModuleCallingContext const* mcc) {
222 
223  ModuleCallingContext const* imcc = mcc;
224  while(imcc->type() == ParentContext::Type::kModule) {
225  std::ostringstream iost;
226  iost << "Calling method for unscheduled module "
227  << imcc->moduleDescription()->moduleName() << "/'"
228  << imcc->moduleDescription()->moduleLabel() << "'";
229  ex.addContext(iost.str());
230  imcc = imcc->moduleCallingContext();
231  }
232  if(imcc->type() == ParentContext::Type::kInternal) {
233  std::ostringstream iost;
234  iost << "Calling method for unscheduled module "
235  << imcc->moduleDescription()->moduleName() << "/'"
236  << imcc->moduleDescription()->moduleLabel() << "' (probably inside some kind of mixing module)";
237  ex.addContext(iost.str());
238  imcc = imcc->internalContext()->moduleCallingContext();
239  }
240  while(imcc->type() == ParentContext::Type::kModule) {
241  std::ostringstream iost;
242  iost << "Calling method for unscheduled module "
243  << imcc->moduleDescription()->moduleName() << "/'"
244  << imcc->moduleDescription()->moduleLabel() << "'";
245  ex.addContext(iost.str());
246  imcc = imcc->moduleCallingContext();
247  }
248  std::ostringstream ost;
249  if (T::isEvent_) {
250  ost << "Calling event method";
251  }
252  else {
253  // It should be impossible to get here, because
254  // this function only gets called when the IgnoreCompletely
255  // exception behavior is active, which can only be true
256  // for events.
257  ost << "Calling unknown function";
258  }
259  ost << " for module " << imcc->moduleDescription()->moduleName() << "/'" << imcc->moduleDescription()->moduleLabel() << "'";
260  ex.addContext(ost.str());
261 
262  if (imcc->type() == ParentContext::Type::kPlaceInPath) {
263  ost.str("");
264  ost << "Running path '";
265  ost << imcc->placeInPathContext()->pathContext()->pathName() << "'";
266  ex.addContext(ost.str());
267  }
268  ost.str("");
269  ost << "Processing ";
270  ost << principal.id();
271  ex.addContext(ost.str());
272  }
273  }
274 
275  namespace workerhelper {
276  template<>
278  public:
280  static bool call(Worker* iWorker, StreamID,
281  EventPrincipal& ep, EventSetup const& es,
282  ActivityRegistry* /* actReg */,
283  ModuleCallingContext const* mcc,
284  Arg::Context const* /* context*/) {
285  //Signal sentry is handled by the module
286  return iWorker->implDo(ep,es, mcc);
287  }
288  };
289 
290  template<>
292  public:
294  static bool call(Worker* iWorker,StreamID,
295  RunPrincipal& ep, EventSetup const& es,
296  ActivityRegistry* actReg,
297  ModuleCallingContext const* mcc,
298  Arg::Context const* context) {
299  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
300  return iWorker->implDoBegin(ep,es, mcc);
301  }
302  };
303  template<>
305  public:
307  static bool call(Worker* iWorker,StreamID id,
308  RunPrincipal& ep, EventSetup const& es,
309  ActivityRegistry* actReg,
310  ModuleCallingContext const* mcc,
311  Arg::Context const* context) {
312  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
313  return iWorker->implDoStreamBegin(id,ep,es, mcc);
314  }
315  };
316  template<>
318  public:
320  static bool call(Worker* iWorker,StreamID,
321  RunPrincipal& ep, EventSetup const& es,
322  ActivityRegistry* actReg,
323  ModuleCallingContext const* mcc,
324  Arg::Context const* context) {
325  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
326  return iWorker->implDoEnd(ep,es, mcc);
327  }
328  };
329  template<>
331  public:
333  static bool call(Worker* iWorker,StreamID id,
334  RunPrincipal& ep, EventSetup const& es,
335  ActivityRegistry* actReg,
336  ModuleCallingContext const* mcc,
337  Arg::Context const* context) {
338  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
339  return iWorker->implDoStreamEnd(id,ep,es, mcc);
340  }
341  };
342 
343  template<>
345  public:
347  static bool call(Worker* iWorker,StreamID,
348  LuminosityBlockPrincipal& ep, EventSetup const& es,
349  ActivityRegistry* actReg,
350  ModuleCallingContext const* mcc,
351  Arg::Context const* context) {
352  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
353  return iWorker->implDoBegin(ep,es, mcc);
354  }
355  };
356  template<>
358  public:
360  static bool call(Worker* iWorker,StreamID id,
361  LuminosityBlockPrincipal& ep, EventSetup const& es,
362  ActivityRegistry* actReg,
363  ModuleCallingContext const* mcc,
364  Arg::Context const* context) {
365  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
366  return iWorker->implDoStreamBegin(id,ep,es, mcc);
367  }
368  };
369 
370  template<>
372  public:
374  static bool call(Worker* iWorker,StreamID,
375  LuminosityBlockPrincipal& ep, EventSetup const& es,
376  ActivityRegistry* actReg,
377  ModuleCallingContext const* mcc,
378  Arg::Context const* context) {
379  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
380  return iWorker->implDoEnd(ep,es, mcc);
381  }
382  };
383  template<>
385  public:
387  static bool call(Worker* iWorker,StreamID id,
388  LuminosityBlockPrincipal& ep, EventSetup const& es,
389  ActivityRegistry* actReg,
390  ModuleCallingContext const* mcc,
391  Arg::Context const* context) {
392  ModuleSignalSentry<Arg> cpp(actReg, context, mcc);
393  return iWorker->implDoStreamEnd(id,ep,es, mcc);
394  }
395  };
396  }
397 
398  template <typename T>
399  bool Worker::doWork(typename T::MyPrincipal& ep,
400  EventSetup const& es,
401  StreamID streamID,
402  ParentContext const& parentContext,
403  typename T::Context const* context) {
404 
405  if (T::isEvent_) {
406  ++timesVisited_;
407  }
408  bool rc = false;
409 
410  switch(state_) {
411  case Ready: break;
412  case Pass: return true;
413  case Fail: return false;
414  case Exception: {
415  cached_exception_->raise();
416  }
417  }
418 
419  ModuleContextSentry moduleContextSentry(&moduleCallingContext_, parentContext);
420 
421  try {
422  convertException::wrap([&]() {
423 
424  if (T::isEvent_) {
425  ++timesRun_;
426 
427  // Prefetch products the module declares it consumes (not including the products it maybe consumes)
428  std::vector<ProductHolderIndexAndSkipBit> const& items = itemsToGetFromEvent();
429  for(auto const& item : items) {
430  ProductHolderIndex productHolderIndex = item.productHolderIndex();
431  bool skipCurrentProcess = item.skipCurrentProcess();
432  if(productHolderIndex != ProductHolderIndexAmbiguous) {
433  ep.prefetch(productHolderIndex, skipCurrentProcess, &moduleCallingContext_);
434  }
435  }
436  }
437 
439  rc = workerhelper::CallImpl<T>::call(this,streamID,ep,es, actReg_.get(), &moduleCallingContext_, context);
440 
441  if (rc) {
442  state_ = Pass;
443  if (T::isEvent_) ++timesPassed_;
444  } else {
445  state_ = Fail;
446  if (T::isEvent_) ++timesFailed_;
447  }
448  });
449  }
450  catch(cms::Exception& ex) {
451 
452  // NOTE: the warning printed as a result of ignoring or failing
453  // a module will only be printed during the full true processing
454  // pass of this module
455 
456  // Get the action corresponding to this exception. However, if processing
457  // something other than an event (e.g. run, lumi) always rethrow.
459 
460  // If we are processing an endpath and the module was scheduled, treat SkipEvent or FailPath
461  // as IgnoreCompletely, so any subsequent OutputModules are still run.
462  // For unscheduled modules only treat FailPath as IgnoreCompletely but still allow SkipEvent to throw
464  if(top_mcc->type() == ParentContext::Type::kPlaceInPath &&
465  top_mcc->placeInPathContext()->pathContext()->isEndPath()) {
466 
469  }
470  switch(action) {
472  rc = true;
473  ++timesPassed_;
474  state_ = Pass;
475  exceptionContext<T>(ep, ex, &moduleCallingContext_);
476  edm::printCmsExceptionWarning("IgnoreCompletely", ex);
477  break;
478  default:
479  if (T::isEvent_) ++timesExcept_;
480  state_ = Exception;
481  cached_exception_.reset(ex.clone());
482  cached_exception_->raise();
483  }
484  }
485  return rc;
486  }
487 }
488 #endif
static bool call(Worker *iWorker, StreamID, LuminosityBlockPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:374
bool doWork(typename T::MyPrincipal &, EventSetup const &c, StreamID stream, ParentContext const &parentContext, typename T::Context const *context)
Definition: Worker.h:399
void pathFinished(EventPrincipal &)
Definition: Worker.cc:184
void resetModuleDescription(ModuleDescription const *)
Definition: Worker.cc:98
ModuleDescription const & description() const
Definition: Worker.h:99
void setEarlyDeleteHelper(EarlyDeleteHelper *iHelper)
Definition: Worker.cc:94
virtual void modulesWhoseProductsAreConsumed(std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc) const =0
ModuleCallingContext const * getTopModuleCallingContext() const
virtual void implPostForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren)=0
virtual ~Worker()
Definition: Worker.cc:87
void endJob()
Definition: Worker.cc:120
OccurrenceTraits< LuminosityBlockPrincipal, BranchActionStreamBegin > Arg
Definition: Worker.h:359
static bool call(Worker *iWorker, StreamID id, LuminosityBlockPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:387
OccurrenceTraits< RunPrincipal, BranchActionGlobalEnd > Arg
Definition: Worker.h:319
int timesPassed() const
Definition: Worker.h:127
virtual void implRespondToCloseInputFile(FileBlock const &fb)=0
std::shared_ptr< ActivityRegistry > actReg_
Definition: Worker.h:191
State state() const
Definition: Worker.h:130
void clearCounters()
Definition: Worker.h:121
std::string const & moduleName() const
std::string const & category() const
Definition: Exception.cc:183
exception_actions::ActionCodes find(const std::string &category) const
unsigned int ProductHolderIndex
ActivityRegistry * activityRegistry()
Definition: Worker.h:162
void beginStream(StreamID id, StreamContext &streamContext)
Definition: Worker.cc:136
virtual bool implDoStreamBegin(StreamID id, RunPrincipal &rp, EventSetup const &c, ModuleCallingContext const *mcc)=0
virtual void implPreForkReleaseResources()=0
virtual std::string workerType() const =0
virtual void itemsToGet(BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const =0
ExceptionToActionTable const * actions_
Definition: Worker.h:188
void setActivityRegistry(std::shared_ptr< ActivityRegistry > areg)
Definition: Worker.cc:90
EarlyDeleteHelper * earlyDeleteHelper_
Definition: Worker.h:193
ModuleCallingContext moduleCallingContext_
Definition: Worker.h:186
BranchType
Definition: BranchType.h:11
static bool call(Worker *iWorker, StreamID id, RunPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:333
bool isEndPath() const
Definition: PathContext.h:42
int timesExcept() const
Definition: Worker.h:129
int timesExcept_
Definition: Worker.h:183
virtual bool implDoBegin(RunPrincipal &rp, EventSetup const &c, ModuleCallingContext const *mcc)=0
virtual void updateLookup(BranchType iBranchType, ProductHolderIndexHelper const &)=0
Worker & operator=(Worker const &)=delete
void reset()
Definition: Worker.h:94
virtual void implRegisterThinnedAssociations(ProductRegistry const &, ThinnedAssociationsHelper &)=0
virtual bool implDo(EventPrincipal &, EventSetup const &c, ModuleCallingContext const *mcc)=0
int timesVisited() const
Definition: Worker.h:126
PathContext const * pathContext() const
int timesPassed_
Definition: Worker.h:181
OccurrenceTraits< RunPrincipal, BranchActionGlobalBegin > Arg
Definition: Worker.h:293
ModuleDescription const * descPtr() const
Definition: Worker.h:100
ModuleDescription const * moduleDescription() const
virtual std::vector< ConsumesInfo > consumesInfo() const =0
void registerThinnedAssociations(ProductRegistry const &registry, ThinnedAssociationsHelper &helper)
Definition: Worker.h:92
void printCmsExceptionWarning(char const *behavior, cms::Exception const &e, edm::JobReport *jobRep=0, int rc=-1)
OccurrenceTraits< LuminosityBlockPrincipal, BranchActionGlobalEnd > Arg
Definition: Worker.h:373
Worker(ModuleDescription const &iMD, ExceptionToActionTable const *iActions)
Definition: Worker.cc:71
int timesRun() const
Definition: Worker.h:125
OccurrenceTraits< LuminosityBlockPrincipal, BranchActionStreamEnd > Arg
Definition: Worker.h:386
static bool call(Worker *iWorker, StreamID, LuminosityBlockPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:347
static bool call(Worker *iWorker, StreamID id, RunPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:307
virtual void implEndJob()=0
virtual std::vector< ProductHolderIndexAndSkipBit > const & itemsToGetFromEvent() const =0
virtual void modulesDependentUpon(std::vector< const char * > &oModuleLabels) const =0
areg
Definition: Schedule.cc:370
void postForkReacquireResources(unsigned int iChildIndex, unsigned int iNumberOfChildren)
Definition: Worker.h:91
virtual Types moduleType() const =0
OccurrenceTraits< EventPrincipal, BranchActionStreamBegin > Arg
Definition: Worker.h:279
void postDoEvent(EventPrincipal &)
Definition: Worker.cc:189
OccurrenceTraits< RunPrincipal, BranchActionStreamBegin > Arg
Definition: Worker.h:306
virtual void implBeginJob()=0
void respondToOpenInputFile(FileBlock const &fb)
Definition: Worker.h:87
virtual void itemsMayGet(BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const =0
int timesRun_
Definition: Worker.h:179
int timesPass() const
Definition: Worker.h:132
static bool call(Worker *iWorker, StreamID, EventPrincipal &ep, EventSetup const &es, ActivityRegistry *, ModuleCallingContext const *mcc, Arg::Context const *)
Definition: Worker.h:280
void addContext(std::string const &context)
Definition: Exception.cc:227
virtual void implBeginStream(StreamID)=0
virtual void implEndStream(StreamID)=0
int timesFailed() const
Definition: Worker.h:128
void respondToCloseInputFile(FileBlock const &fb)
Definition: Worker.h:88
void preForkReleaseResources()
Definition: Worker.h:90
double a
Definition: hdecay.h:121
std::shared_ptr< cms::Exception > cached_exception_
Definition: Worker.h:189
void beginJob()
Definition: Worker.cc:104
void endStream(StreamID id, StreamContext &streamContext)
Definition: Worker.cc:160
int timesFailed_
Definition: Worker.h:182
auto wrap(F iFunc) -> decltype(iFunc())
static Interceptor::Registry registry("Interceptor")
virtual bool implDoEnd(RunPrincipal &rp, EventSetup const &c, ModuleCallingContext const *mcc)=0
OccurrenceTraits< LuminosityBlockPrincipal, BranchActionGlobalBegin > Arg
Definition: Worker.h:346
preg
Definition: Schedule.cc:370
virtual void implRespondToOpenInputFile(FileBlock const &fb)=0
static bool call(Worker *iWorker, StreamID id, LuminosityBlockPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:360
PlaceInPathContext const * placeInPathContext() const
OccurrenceTraits< RunPrincipal, BranchActionStreamEnd > Arg
Definition: Worker.h:332
virtual bool implDoStreamEnd(StreamID id, RunPrincipal &rp, EventSetup const &c, ModuleCallingContext const *mcc)=0
State state_
Definition: Worker.h:184
int timesVisited_
Definition: Worker.h:180
static bool call(Worker *iWorker, StreamID, RunPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:294
static bool call(Worker *iWorker, StreamID, RunPrincipal &ep, EventSetup const &es, ActivityRegistry *actReg, ModuleCallingContext const *mcc, Arg::Context const *context)
Definition: Worker.h:320