aboutsummaryrefslogtreecommitdiff
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
parent1b0fe5a6e8141a2c37770e67d24ec341b02b7fc3 (diff)
eventflag API addtiion
-rw-r--r--ChangeLog2
-rw-r--r--eventflag.c71
-rw-r--r--eventflag.h5
3 files changed, 49 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index a4be6ac..2299b39 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);