diff --git a/ChangeLog b/ChangeLog index 26dfcf9..f16a4ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ 2018-11-09 NIIBE Yutaka - * eventflag.c (eventflag_wait_all): New. + * eventflag.c (eventflag_set_mask): New. 2018-10-02 NIIBE Yutaka diff --git a/eventflag.c b/eventflag.c index 2691713..69916ab 100644 --- a/eventflag.c +++ b/eventflag.c @@ -36,17 +36,29 @@ void eventflag_init (struct eventflag *ev) { ev->flags = 0; + ev->mask = ~0; chopstx_cond_init (&ev->cond); chopstx_mutex_init (&ev->mutex); } +void +eventflag_set_mask (struct eventflag *ev, eventmask_t m) +{ + chopstx_mutex_lock (&ev->mutex); + ev->mask = m; + if ((ev->flags & ev->mask)) + chopstx_cond_signal (&ev->cond); + chopstx_mutex_unlock (&ev->mutex); +} + + static int eventflag_check (void *arg) { struct eventflag *ev = arg; - return ev->flags != 0; + return (ev->flags & ev->mask) != 0; } @@ -69,7 +81,7 @@ eventflag_get (struct eventflag *ev) eventmask_t m; chopstx_mutex_lock (&ev->mutex); - n = __builtin_ffs (ev->flags); + n = __builtin_ffs ((ev->flags & ev->mask)); if (n) { m = (1 << (n - 1)); @@ -90,10 +102,10 @@ eventflag_wait (struct eventflag *ev) eventmask_t m; chopstx_mutex_lock (&ev->mutex); - if (!ev->flags) + while (!(ev->flags & ev->mask)) chopstx_cond_wait (&ev->cond, &ev->mutex); - n = __builtin_ffs (ev->flags); + n = __builtin_ffs ((ev->flags & ev->mask)); if (n) /* Always n > 0 when waked up, but make sure no bad things. */ { m = (1 << (n - 1)); @@ -107,17 +119,6 @@ eventflag_wait (struct eventflag *ev) } -void -eventflag_wait_all (struct eventflag *ev, eventmask_t m) -{ - chopstx_mutex_lock (&ev->mutex); - while ((ev->flags & m) != m) - chopstx_cond_wait (&ev->cond, &ev->mutex); - ev->flags &= ~m; - chopstx_mutex_unlock (&ev->mutex); -} - - eventmask_t eventflag_wait_timeout (struct eventflag *ev, uint32_t usec) { @@ -135,6 +136,7 @@ eventflag_signal (struct eventflag *ev, eventmask_t m) { chopstx_mutex_lock (&ev->mutex); ev->flags |= m; - chopstx_cond_signal (&ev->cond); + if ((ev->flags & ev->mask)) + chopstx_cond_signal (&ev->cond); chopstx_mutex_unlock (&ev->mutex); } diff --git a/eventflag.h b/eventflag.h index f1bc074..7a9c145 100644 --- a/eventflag.h +++ b/eventflag.h @@ -2,13 +2,14 @@ typedef uint32_t eventmask_t; struct eventflag { eventmask_t flags; + eventmask_t mask; chopstx_mutex_t mutex; chopstx_cond_t cond; }; void eventflag_init (struct eventflag *ev); +void eventflag_set_mask (struct eventflag *ev, eventmask_t m); eventmask_t eventflag_wait (struct eventflag *ev); -void eventflag_wait_all (struct eventflag *ev, eventmask_t m); eventmask_t eventflag_wait_timeout (struct eventflag *ev, uint32_t usec); void eventflag_signal (struct eventflag *ev, eventmask_t m);