diff options
author | Mattias Andrée <maandree@operamail.com> | 2015-05-17 14:28:20 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2015-05-17 14:28:20 +0200 |
commit | 0f31d194025df5d63fcee65e32baa90cc5aa0ad6 (patch) | |
tree | 83ff9e158ba9df44dc8bb1a3c4ff6304ceb86a29 /src | |
parent | implemented timed write, read and poll (diff) | |
download | bus-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.c | 25 | ||||
-rw-r--r-- | src/bus.h | 9 |
2 files changed, 9 insertions, 25 deletions
@@ -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; @@ -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. |