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 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 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>); }
};