Add eventflag_set_mask, removing eventflag_wait_all.

This commit is contained in:
NIIBE Yutaka
2018-11-09 20:44:22 +09:00
parent 2992b894e0
commit 1369361e59
3 changed files with 21 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
2018-11-09 NIIBE Yutaka <gniibe@fsij.org> 2018-11-09 NIIBE Yutaka <gniibe@fsij.org>
* eventflag.c (eventflag_wait_all): New. * eventflag.c (eventflag_set_mask): New.
2018-10-02 NIIBE Yutaka <gniibe@fsij.org> 2018-10-02 NIIBE Yutaka <gniibe@fsij.org>

View File

@@ -36,17 +36,29 @@ void
eventflag_init (struct eventflag *ev) eventflag_init (struct eventflag *ev)
{ {
ev->flags = 0; ev->flags = 0;
ev->mask = ~0;
chopstx_cond_init (&ev->cond); chopstx_cond_init (&ev->cond);
chopstx_mutex_init (&ev->mutex); 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 static int
eventflag_check (void *arg) eventflag_check (void *arg)
{ {
struct eventflag *ev = 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; eventmask_t m;
chopstx_mutex_lock (&ev->mutex); chopstx_mutex_lock (&ev->mutex);
n = __builtin_ffs (ev->flags); n = __builtin_ffs ((ev->flags & ev->mask));
if (n) if (n)
{ {
m = (1 << (n - 1)); m = (1 << (n - 1));
@@ -90,10 +102,10 @@ eventflag_wait (struct eventflag *ev)
eventmask_t m; eventmask_t m;
chopstx_mutex_lock (&ev->mutex); chopstx_mutex_lock (&ev->mutex);
if (!ev->flags) while (!(ev->flags & ev->mask))
chopstx_cond_wait (&ev->cond, &ev->mutex); 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. */ if (n) /* Always n > 0 when waked up, but make sure no bad things. */
{ {
m = (1 << (n - 1)); 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 eventmask_t
eventflag_wait_timeout (struct eventflag *ev, uint32_t usec) 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); chopstx_mutex_lock (&ev->mutex);
ev->flags |= m; ev->flags |= m;
chopstx_cond_signal (&ev->cond); if ((ev->flags & ev->mask))
chopstx_cond_signal (&ev->cond);
chopstx_mutex_unlock (&ev->mutex); chopstx_mutex_unlock (&ev->mutex);
} }

View File

@@ -2,13 +2,14 @@ typedef uint32_t eventmask_t;
struct eventflag { struct eventflag {
eventmask_t flags; eventmask_t flags;
eventmask_t mask;
chopstx_mutex_t mutex; chopstx_mutex_t mutex;
chopstx_cond_t cond; chopstx_cond_t cond;
}; };
void eventflag_init (struct eventflag *ev); void eventflag_init (struct eventflag *ev);
void eventflag_set_mask (struct eventflag *ev, eventmask_t m);
eventmask_t eventflag_wait (struct eventflag *ev); 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); eventmask_t eventflag_wait_timeout (struct eventflag *ev, uint32_t usec);
void eventflag_signal (struct eventflag *ev, eventmask_t m); void eventflag_signal (struct eventflag *ev, eventmask_t m);