MultiEvent

Files CCore/inc/task/MultiEvent.h CCore/src/task/MultiEvent.cpp

MultiEvent is similar to the MultiSem, but combines events, not semaphores.


template <ulen Len>
class MultiEvent : public Funchor_nocopy 
 {
   ....

  public:

   // constructors
  
   MultiEvent();
   
   explicit MultiEvent(TextLabel name);
   
   ~MultiEvent();

   // trigger
  
   bool trigger(ulen index); // [1,Len]
   
   // wait
   
   ulen try_wait(); // [0,Len]
   
   ulen wait(); // [1,Len]
   
   ulen wait(MSec timeout); // [0,Len]
   
   ulen wait(TimeScope time_scope); // [0,Len]
   
   // trigger<Index>
   
   template <ulen Index> // [1,Len]
   void trigger_index() { trigger(Index); }
   
   // functions
   
   template <ulen Index>
   Function<void (void)> function_trigger() { return FunctionOf(this,&MultiEventBase::trigger_index<Index>); }
 };

trigger() sets the event flag with the specified 1-base index, it must be in the range [1,Len]. If the flag is already set, the return value is false, otherwise it is true.

try_wait() tries to consume an event flag. This method never blocks. The return value is the flag 1-based index, if the method was successful. Otherwise it is zero.

wait() consumes one of the event flags. It may block the calling thread indefinitely, until the operation becomes possible.

wait(MSec) and wait(TimeScope) are the timed variants of the wait(). These methods wait up to the specified timeout is expired, then operation failed. The return value is zero in this case.

HCore MultiEvent

HCore MultiEvent has the common interface.


template <ulen Len>
class MultiEvent : public Funchor_nocopy 
 {
   ....

  public:

   // constructors
  
   MultiEvent();
   
   explicit MultiEvent(TextLabel name);
   
   ~MultiEvent();

   // trigger
  
   bool trigger(ulen index); // [1,Len]
   
   // wait
   
   ulen try_wait(); // [0,Len]
   
   ulen wait(); // [1,Len]
   
   ulen wait(MSec timeout); // [0,Len]
   
   ulen wait(TimeScope time_scope); // [0,Len]
   
   // trigger<Index>
   
   template <ulen Index> // [1,Len]
   void trigger_index() { trigger(Index); }
   
   // functions
   
   template <ulen Index>
   Function<void (void)> function_trigger() { return FunctionOf(this,&MultiEventBase::trigger_index<Index>); }
 };

XCore MultiEvent

XCore MultiEvent is essentially the same, but has trigger() method variants for different execution contexts.


template <ulen Len>
class MultiEvent : public Funchor_nocopy 
 {
   ....

  public:

   // constructors
  
   MultiEvent();
   
   explicit MultiEvent(TextLabel name);
   
   ~MultiEvent();

   TextLabel getName() const { return name; }
   
   // trigger
  
   bool trigger(ulen index); // [1,Len]
   
   bool trigger_int(ulen index); // [1,Len]
   
   bool trigger_any(ulen index); // [1,Len]
   
   // wait
   
   ulen try_wait(); // [0,Len]
   
   ulen wait(); // [1,Len]
   
   ulen wait(MSec timeout); // [0,Len]
   
   ulen wait(TimeScope time_scope); // [0,Len]
   
   // trigger<Index>
   
   template <ulen Index> // [1,Len]
   void trigger_index() { trigger(Index); }
   
   template <ulen Index> // [1,Len]
   void trigger_index_int() { trigger_int(Index); }
   
   template <ulen Index> // [1,Len]
   void trigger_index_any() { trigger_any(Index); }
   
   // functions
   
   template <ulen Index>
   Function<void (void)> function_trigger() { return FunctionOf(this,&MultiEventBase::trigger_index<Index>); }
   
   template <ulen Index>
   Function<void (void)> function_trigger_int() { return FunctionOf(this,&MultiEventBase::trigger_index_int<Index>); }
   
   template <ulen Index>
   Function<void (void)> function_trigger_any() { return FunctionOf(this,&MultiEventBase::trigger_index_any<Index>); }
 };