summaryrefslogtreecommitdiff
path: root/eventflag.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2016-05-19 11:48:01 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2016-05-19 11:48:01 +0900
commit03bba13005914068dbf0707c77e6c22c5e76c9f5 (patch)
tree1da7f9bb4fc3124ea1d96732d661e6417affeedd /eventflag.c
parent1b0fe5a6e8141a2c37770e67d24ec341b02b7fc3 (diff)
eventflag API addtiion
Diffstat (limited to 'eventflag.c')
-rw-r--r--eventflag.c71
1 files changed, 44 insertions, 27 deletions
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);
}