diff --git a/os/kernel/src/chevents.c b/os/kernel/src/chevents.c index a66a7fa28..a0ef2d1bb 100644 --- a/os/kernel/src/chevents.c +++ b/os/kernel/src/chevents.c @@ -382,11 +382,15 @@ eventmask_t chEvtWaitOneTimeout(eventmask_t mask, systime_t time) { chSysLock(); if ((m = (ctp->p_epending & mask)) == 0) { - if (TIME_IMMEDIATE == time) + if (TIME_IMMEDIATE == time) { + chSysUnlock(); return (eventmask_t)0; + } ctp->p_u.ewmask = mask; - if (chSchGoSleepTimeoutS(THD_STATE_WTOREVT, time) < RDY_OK) + if (chSchGoSleepTimeoutS(THD_STATE_WTOREVT, time) < RDY_OK) { + chSysUnlock(); return (eventmask_t)0; + } m = ctp->p_epending & mask; } m &= -m; @@ -421,11 +425,15 @@ eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t time) { chSysLock(); if ((m = (ctp->p_epending & mask)) == 0) { - if (TIME_IMMEDIATE == time) + if (TIME_IMMEDIATE == time) { + chSysUnlock(); return (eventmask_t)0; + } ctp->p_u.ewmask = mask; - if (chSchGoSleepTimeoutS(THD_STATE_WTOREVT, time) < RDY_OK) + if (chSchGoSleepTimeoutS(THD_STATE_WTOREVT, time) < RDY_OK) { + chSysUnlock(); return (eventmask_t)0; + } m = ctp->p_epending & mask; } ctp->p_epending &= ~m; @@ -457,11 +465,15 @@ eventmask_t chEvtWaitAllTimeout(eventmask_t mask, systime_t time) { chSysLock(); if ((ctp->p_epending & mask) != mask) { - if (TIME_IMMEDIATE == time) + if (TIME_IMMEDIATE == time) { + chSysUnlock(); return (eventmask_t)0; + } ctp->p_u.ewmask = mask; - if (chSchGoSleepTimeoutS(THD_STATE_WTANDEVT, time) < RDY_OK) + if (chSchGoSleepTimeoutS(THD_STATE_WTANDEVT, time) < RDY_OK) { + chSysUnlock(); return (eventmask_t)0; + } } ctp->p_epending &= ~mask;