aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--os/kernel/src/chevents.c24
1 files changed, 18 insertions, 6 deletions
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;