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>
* eventflag.c (eventflag_wait_all): New.
* eventflag.c (eventflag_set_mask): New.
2018-10-02 NIIBE Yutaka <gniibe@fsij.org>

View File

@@ -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);
}

View File

@@ -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);