diff --git a/os/rt/include/chevents.h b/os/rt/include/chevents.h index 43962c636..563667c8c 100644 --- a/os/rt/include/chevents.h +++ b/os/rt/include/chevents.h @@ -120,6 +120,10 @@ typedef void (*evhandler_t)(eventid_t id); #ifdef __cplusplus extern "C" { #endif + void chEvtRegisterMaskWithFlagsI(event_source_t *esp, + event_listener_t *elp, + eventmask_t events, + eventflags_t wflags); void chEvtRegisterMaskWithFlags(event_source_t *esp, event_listener_t *elp, eventmask_t events, diff --git a/os/rt/src/chevents.c b/os/rt/src/chevents.c index 81138ab1b..3a2594c1a 100644 --- a/os/rt/src/chevents.c +++ b/os/rt/src/chevents.c @@ -98,23 +98,47 @@ * the event source is broadcasted * @param[in] wflags mask of flags the listening thread is interested in * - * @api + * @iclass */ -void chEvtRegisterMaskWithFlags(event_source_t *esp, - event_listener_t *elp, - eventmask_t events, - eventflags_t wflags) { +void chEvtRegisterMaskWithFlagsI(event_source_t *esp, + event_listener_t *elp, + eventmask_t events, + eventflags_t wflags) { thread_t *currtp = chThdGetSelfX(); + chDbgCheckClassI(); chDbgCheck((esp != NULL) && (elp != NULL)); - chSysLock(); elp->next = esp->next; esp->next = elp; elp->listener = currtp; elp->events = events; elp->flags = (eventflags_t)0; elp->wflags = wflags; +} + +/** + * @brief Registers an Event Listener on an Event Source. + * @details Once a thread has registered as listener on an event source it + * will be notified of all events broadcasted there. + * @note Multiple Event Listeners can specify the same bits to be ORed to + * different threads. + * + * @param[in] esp pointer to the @p event_source_t structure + * @param[in] elp pointer to the @p event_listener_t structure + * @param[in] events events to be ORed to the thread when + * the event source is broadcasted + * @param[in] wflags mask of flags the listening thread is interested in + * + * @api + */ +void chEvtRegisterMaskWithFlags(event_source_t *esp, + event_listener_t *elp, + eventmask_t events, + eventflags_t wflags) { + + chSysLock(); + chEvtRegisterMaskWithFlagsI(esp, elp, events, wflags); chSysUnlock(); } @@ -164,6 +188,8 @@ eventmask_t chEvtGetAndClearEventsI(eventmask_t events) { thread_t *currtp = chThdGetSelfX(); eventmask_t m; + chDbgCheckClassI(); + m = currtp->epending & events; currtp->epending &= ~events;