aboutsummaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/examples/timed/.gitignore1
-rw-r--r--doc/examples/timed/Makefile2
-rw-r--r--doc/examples/timed/README12
-rw-r--r--doc/examples/timed/poll.c1
-rw-r--r--doc/examples/timed/slow-poll.c46
-rw-r--r--doc/examples/timed/write.c5
6 files changed, 62 insertions, 5 deletions
diff --git a/doc/examples/timed/.gitignore b/doc/examples/timed/.gitignore
index b1076f0..cb90bfb 100644
--- a/doc/examples/timed/.gitignore
+++ b/doc/examples/timed/.gitignore
@@ -3,4 +3,5 @@ init
write
poll
read
+slow-poll
diff --git a/doc/examples/timed/Makefile b/doc/examples/timed/Makefile
index fe1285c..9506947 100644
--- a/doc/examples/timed/Makefile
+++ b/doc/examples/timed/Makefile
@@ -1,4 +1,4 @@
-COMMANDS = init cleanup write poll read
+COMMANDS = init cleanup write poll read slow-poll
all: ${COMMANDS}
diff --git a/doc/examples/timed/README b/doc/examples/timed/README
index 215a738..8293758 100644
--- a/doc/examples/timed/README
+++ b/doc/examples/timed/README
@@ -12,11 +12,19 @@ When you are done run ./cleanup.
Running instances of ./poll will wait for new messages
continuously, but with one second timeouts.
+./slow-poll works like ./poll, execpt it will sleep
+for one second every time it receives a message.
+
Running instances of ./read will read for ten seconds
then time out.
-./poll and ./read will stop if the message "stop" is
-broadcasted.
+./poll, ./read, and ./slow-poll will stop if the message
+"stop" is broadcasted.
+
+./write will wait for atmost a tenth of a seconds before
+failing. This means that if two instances of ./write is
+started at the same time one of them will fail if
+./slow-poll is running.
./poll, ./read, ./init and ./cleanup are run without any
additional arguments. ./write is run with the message
diff --git a/doc/examples/timed/poll.c b/doc/examples/timed/poll.c
index d57d4ea..5ae45d4 100644
--- a/doc/examples/timed/poll.c
+++ b/doc/examples/timed/poll.c
@@ -24,7 +24,6 @@ main()
if (message == NULL) {
t(errno != EAGAIN);
printf("waiting... %lli\n", ++tick);
- sleep(1);
continue;
}
tick = 0;
diff --git a/doc/examples/timed/slow-poll.c b/doc/examples/timed/slow-poll.c
new file mode 100644
index 0000000..5076ef6
--- /dev/null
+++ b/doc/examples/timed/slow-poll.c
@@ -0,0 +1,46 @@
+#include <bus.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#define t(stmt) if (stmt) goto fail
+
+
+
+int
+main()
+{
+ bus_t bus;
+ const char *message;
+ long long tick = 0;
+ struct timespec timeout;
+ t(bus_open(&bus, "/tmp/example-bus", BUS_RDONLY));
+ t(bus_poll_start(&bus));
+ for (;;) {
+ t(clock_gettime(CLOCK_MONOTONIC, &timeout));
+ timeout.tv_sec += 1;
+ message = bus_poll_timed(&bus, &timeout, CLOCK_MONOTONIC);
+ if (message == NULL) {
+ t(errno != EAGAIN);
+ printf("waiting... %lli\n", ++tick);
+ continue;
+ }
+ tick = 0;
+ message = strchr(message, ' ') + 1;
+ if (!strcmp(message, "stop"))
+ break;
+ printf("\033[01m%s\033[21m\n", message);
+ sleep(1);
+ }
+ t(bus_poll_stop(&bus));
+ bus_close(&bus);
+ return 0;
+
+fail:
+ perror("poll");
+ bus_poll_stop(&bus);
+ bus_close(&bus);
+ return 1;
+}
+
diff --git a/doc/examples/timed/write.c b/doc/examples/timed/write.c
index 250ba14..acd8c6f 100644
--- a/doc/examples/timed/write.c
+++ b/doc/examples/timed/write.c
@@ -15,13 +15,16 @@ int
main(int argc, char *argv[])
{
bus_t bus;
+ struct timespec timeout;
if (argc < 2) {
fprintf(stderr, "%s: USAGE: %s message\n", argv[0], argv[0]);
return 2;
}
sprintf(message, "0 %s", argv[1]);
t(bus_open(&bus, "/tmp/example-bus", BUS_WRONLY));
- t(bus_write(&bus, message, 0));
+ t(clock_gettime(CLOCK_MONOTONIC, &timeout));
+ timeout.tv_nsec += 100000000L;
+ t(bus_write_timed(&bus, message, &timeout, CLOCK_MONOTONIC));
bus_close(&bus);
return 0;