eventflag API addtiion
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
2016-05-18 NIIBE Yutaka <gniibe@fsij.org>
|
||||
|
||||
* eventflag.c: Update using chopstx_poll.
|
||||
* eventflag.c: Update using chopstx_poll and offer API for poll.
|
||||
|
||||
* chopstx.c (requeue): New.
|
||||
(chopstx_mutex_lock, chopstx_join): Fix by requeue.
|
||||
|
||||
73
eventflag.c
73
eventflag.c
@@ -41,23 +41,6 @@ eventflag_init (struct eventflag *ev)
|
||||
}
|
||||
|
||||
|
||||
eventmask_t
|
||||
eventflag_wait (struct eventflag *ev)
|
||||
{
|
||||
int n;
|
||||
|
||||
chopstx_mutex_lock (&ev->mutex);
|
||||
if (!ev->flags)
|
||||
chopstx_cond_wait (&ev->cond, &ev->mutex);
|
||||
|
||||
n = __builtin_ffs (ev->flags);
|
||||
ev->flags &= ~(1 << (n - 1));
|
||||
chopstx_mutex_unlock (&ev->mutex);
|
||||
|
||||
return (1 << (n - 1));
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
eventflag_check (void *arg)
|
||||
{
|
||||
@@ -66,8 +49,9 @@ eventflag_check (void *arg)
|
||||
return ev->flags != 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
eventflag_set_poll_desc (struct eventflag *ev, chopstx_poll_cond_t *poll_desc)
|
||||
eventflag_prepare_poll (struct eventflag *ev, chopstx_poll_cond_t *poll_desc)
|
||||
{
|
||||
poll_desc->type = CHOPSTX_POLL_COND;
|
||||
poll_desc->ready = 0;
|
||||
@@ -77,27 +61,60 @@ eventflag_set_poll_desc (struct eventflag *ev, chopstx_poll_cond_t *poll_desc)
|
||||
poll_desc->arg = ev;
|
||||
}
|
||||
|
||||
|
||||
eventmask_t
|
||||
eventflag_wait_timeout (struct eventflag *ev, uint32_t usec)
|
||||
eventflag_get (struct eventflag *ev)
|
||||
{
|
||||
chopstx_poll_cond_t poll_desc;
|
||||
int n;
|
||||
eventmask_t em = 0;
|
||||
|
||||
eventflag_set_poll_desc (ev, &poll_desc);
|
||||
|
||||
chopstx_poll (&usec, 1, &poll_desc);
|
||||
eventmask_t m;
|
||||
|
||||
chopstx_mutex_lock (&ev->mutex);
|
||||
n = __builtin_ffs (ev->flags);
|
||||
if (n)
|
||||
{
|
||||
em = (1 << (n - 1));
|
||||
ev->flags &= ~em;
|
||||
m = (1 << (n - 1));
|
||||
ev->flags &= ~m;
|
||||
}
|
||||
else
|
||||
m = 0;
|
||||
chopstx_mutex_unlock (&ev->mutex);
|
||||
|
||||
return em;
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
eventmask_t
|
||||
eventflag_wait (struct eventflag *ev)
|
||||
{
|
||||
int n;
|
||||
eventmask_t m;
|
||||
|
||||
chopstx_mutex_lock (&ev->mutex);
|
||||
if (!ev->flags)
|
||||
chopstx_cond_wait (&ev->cond, &ev->mutex);
|
||||
|
||||
n = __builtin_ffs (ev->flags);
|
||||
if (n) /* Always n > 0 when waked up, but make sure no bad things. */
|
||||
{
|
||||
m = (1 << (n - 1));
|
||||
ev->flags &= ~m;
|
||||
}
|
||||
else
|
||||
m = 0;
|
||||
chopstx_mutex_unlock (&ev->mutex);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
eventmask_t
|
||||
eventflag_wait_timeout (struct eventflag *ev, uint32_t usec)
|
||||
{
|
||||
chopstx_poll_cond_t poll_desc;
|
||||
|
||||
eventflag_prepare_poll (ev, &poll_desc);
|
||||
chopstx_poll (&usec, 1, &poll_desc);
|
||||
return eventflag_get (ev);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,4 +10,7 @@ void eventflag_init (struct eventflag *ev);
|
||||
eventmask_t eventflag_wait (struct eventflag *ev);
|
||||
eventmask_t eventflag_wait_timeout (struct eventflag *ev, uint32_t usec);
|
||||
void eventflag_signal (struct eventflag *ev, eventmask_t m);
|
||||
void eventflag_set_poll_desc (struct eventflag *ev, chopstx_poll_cond_t *p);
|
||||
|
||||
/* For polling */
|
||||
void eventflag_prepare_poll (struct eventflag *ev, chopstx_poll_cond_t *p);
|
||||
eventmask_t eventflag_get (struct eventflag *ev);
|
||||
|
||||
Reference in New Issue
Block a user