Add eventflag_set_mask, removing eventflag_wait_all.
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
32
eventflag.c
32
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;
|
||||
if ((ev->flags & ev->mask))
|
||||
chopstx_cond_signal (&ev->cond);
|
||||
chopstx_mutex_unlock (&ev->mutex);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user