diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2016-05-19 11:48:01 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2016-05-19 11:48:01 +0900 |
commit | 03bba13005914068dbf0707c77e6c22c5e76c9f5 (patch) | |
tree | 1da7f9bb4fc3124ea1d96732d661e6417affeedd | |
parent | 1b0fe5a6e8141a2c37770e67d24ec341b02b7fc3 (diff) |
eventflag API addtiion
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | eventflag.c | 71 | ||||
-rw-r--r-- | eventflag.h | 5 |
3 files changed, 49 insertions, 29 deletions
@@ -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. diff --git a/eventflag.c b/eventflag.c index c3e6f9a..6271dbc 100644 --- a/eventflag.c +++ b/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; + eventmask_t m; + + chopstx_mutex_lock (&ev->mutex); + n = __builtin_ffs (ev->flags); + if (n) + { + m = (1 << (n - 1)); + ev->flags &= ~m; + } + else + m = 0; + chopstx_mutex_unlock (&ev->mutex); - eventflag_set_poll_desc (ev, &poll_desc); + return m; +} - chopstx_poll (&usec, 1, &poll_desc); + +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) + if (n) /* Always n > 0 when waked up, but make sure no bad things. */ { - 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_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); } diff --git a/eventflag.h b/eventflag.h index f7fab8c..35beb43 100644 --- a/eventflag.h +++ b/eventflag.h @@ -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); |