aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2015-05-17 14:28:20 +0200
committerMattias Andrée <maandree@operamail.com>2015-05-17 14:28:20 +0200
commit0f31d194025df5d63fcee65e32baa90cc5aa0ad6 (patch)
tree83ff9e158ba9df44dc8bb1a3c4ff6304ceb86a29 /src
parentimplemented timed write, read and poll (diff)
downloadbus-0f31d194025df5d63fcee65e32baa90cc5aa0ad6.tar.gz
bus-0f31d194025df5d63fcee65e32baa90cc5aa0ad6.tar.bz2
bus-0f31d194025df5d63fcee65e32baa90cc5aa0ad6.tar.xz
add timed example and fix timed polling
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rw-r--r--src/bus.c25
-rw-r--r--src/bus.h9
2 files changed, 9 insertions, 25 deletions
diff --git a/src/bus.c b/src/bus.c
index 516def1..0517f7a 100644
--- a/src/bus.c
+++ b/src/bus.c
@@ -985,14 +985,11 @@ done:
* @return 0 on success, -1 on error
*/
int
-bus_poll_start(bus_t *bus, int flags)
+bus_poll_start(bus_t *bus)
{
bus->first_poll = 1;
- bus->flags = flags;
t(release_semaphore(bus, S, SEM_UNDO));
- if (flags & BUS_NOWAIT) {
- t(release_semaphore(bus, Q, 0));
- }
+ t(release_semaphore(bus, Q, 0));
return 0;
fail:
@@ -1027,7 +1024,7 @@ bus_poll_stop(const bus_t *bus)
* @return The received message, `NULL` on error
*/
const char *
-bus_poll(bus_t *bus)
+bus_poll(bus_t *bus, int flags)
{
int state = 0, saved_errno;
if (!bus->first_poll) {
@@ -1039,19 +1036,12 @@ bus_poll(bus_t *bus)
#endif
t(release_semaphore(bus, S, SEM_UNDO)); state--;
t(acquire_semaphore(bus, W, SEM_UNDO)); state--;
- if (bus->flags & BUS_NOWAIT) {
- t(release_semaphore(bus, Q, 0));
- }
+ t(release_semaphore(bus, Q, 0));
} else {
bus->first_poll = 0;
}
state--;
- if (bus->flags & BUS_NOWAIT) {
- t(zero_semaphore(bus, Q, IPC_NOWAIT));
- } else {
- t(release_semaphore(bus, Q, 0));
- t(zero_semaphore(bus, Q, 0));
- }
+ t(zero_semaphore(bus, Q, F(BUS_NOWAIT, IPC_NOWAIT)));
return bus->message;
fail:
@@ -1087,7 +1077,7 @@ const char *bus_poll_timed(bus_t *bus, const struct timespec *timeout, clockid_t
int state = 0, saved_errno;
struct timespec delta;
if (!timeout)
- return bus_poll(bus);
+ return bus_poll(bus, 0);
if (!bus->first_poll) {
t(release_semaphore(bus, W, SEM_UNDO)); state++;
@@ -1098,13 +1088,12 @@ const char *bus_poll_timed(bus_t *bus, const struct timespec *timeout, clockid_t
#endif
t(release_semaphore(bus, S, SEM_UNDO)); state--;
t(acquire_semaphore(bus, W, SEM_UNDO)); state--;
+ t(release_semaphore(bus, Q, 0));
} else {
bus->first_poll = 0;
}
state--;
DELTA;
- t(release_semaphore_timed(bus, Q, 0, &delta));
- DELTA;
t(zero_semaphore_timed(bus, Q, 0, &delta));
return bus->message;
diff --git a/src/bus.h b/src/bus.h
index aa35c7b..9d3b436 100644
--- a/src/bus.h
+++ b/src/bus.h
@@ -107,11 +107,6 @@ typedef struct bus
*/
int first_poll;
- /**
- * Flags used for polling
- */
- int flags;
-
} bus_t;
@@ -258,7 +253,7 @@ int bus_read_timed(const bus_t *bus, int (*callback)(const char *message, void *
* the bus when `bus_poll` is called
* @return 0 on success, -1 on error
*/
-int bus_poll_start(bus_t *bus, int flags);
+int bus_poll_start(bus_t *bus);
/**
* Announce that the thread has stopped listening on the bus.
@@ -281,7 +276,7 @@ int bus_poll_stop(const bus_t *bus);
* @param bus Bus information
* @return The received message, `NULL` on error
*/
-const char *bus_poll(bus_t *bus);
+const char *bus_poll(bus_t *bus, int flags);
/**
* Wait for a message to be broadcasted on the bus.