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>
|
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>
|
||||||
|
|
||||||
|
|||||||
34
eventflag.c
34
eventflag.c
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user