diff options
Diffstat (limited to '')
-rw-r--r-- | src/bus.c | 7 | ||||
-rw-r--r-- | src/bus.h | 5 |
2 files changed, 8 insertions, 4 deletions
@@ -723,7 +723,7 @@ const char * bus_poll(bus_t *bus, int flags) { int state = 0, saved_errno; - (void) flags; /* TODO nonblocking */ + (void) flags; if (!bus->first_poll) { t(release_semaphore(bus, W, SEM_UNDO)); state++; t(acquire_semaphore(bus, S, SEM_UNDO)); state++; @@ -734,8 +734,9 @@ bus_poll(bus_t *bus, int flags) } else { bus->first_poll = 0; } + state--; 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: @@ -744,6 +745,8 @@ fail: release_semaphore(bus, S, SEM_UNDO); if (state > 0) acquire_semaphore(bus, W, SEM_UNDO); + if (state < 0) + bus->first_poll = 1; errno = saved_errno; return NULL; } @@ -101,7 +101,8 @@ typedef struct bus /** * Non-zero if and only if `bus_poll` has not been - * called since the last `bus_poll_start` + * called since the last `bus_poll_start`, or + * if `bus_poll` failed during reading */ int first_poll; } bus_t; @@ -190,7 +191,7 @@ int bus_read(const bus_t *bus, int (*callback)(const char *message, void *user_d int bus_poll_start(bus_t *bus); int bus_poll_stop(const bus_t *bus); -const char *bus_poll(bus_t *bus, int falgs); +const char *bus_poll(bus_t *bus, int flags); |