summaryrefslogtreecommitdiffstats
path: root/test/test_sem.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2022-08-18 13:18:52 -0400
committerDavid Robillard <d@drobilla.net>2022-08-18 14:33:37 -0400
commitf65912600fc301cbdbb613f1df0dc29820f1da35 (patch)
tree43db69627433fbb8f5acd13c6cf0ef8a3c3b829d /test/test_sem.c
parentc4b8ca3dc222b06c40ebcb416d653e17e88de858 (diff)
downloadzix-f65912600fc301cbdbb613f1df0dc29820f1da35.tar.gz
zix-f65912600fc301cbdbb613f1df0dc29820f1da35.tar.bz2
zix-f65912600fc301cbdbb613f1df0dc29820f1da35.zip
Use conventional test executable names
Diffstat (limited to 'test/test_sem.c')
-rw-r--r--test/test_sem.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/test/test_sem.c b/test/test_sem.c
new file mode 100644
index 0000000..33859f1
--- /dev/null
+++ b/test/test_sem.c
@@ -0,0 +1,70 @@
+// Copyright 2012-2021 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#undef NDEBUG
+
+#include "zix/attributes.h"
+#include "zix/sem.h"
+#include "zix/thread.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static ZixSem sem;
+static unsigned n_signals = 1024;
+
+static void*
+reader(void* ZIX_UNUSED(arg))
+{
+ printf("Reader starting\n");
+
+ for (unsigned i = 0; i < n_signals; ++i) {
+ zix_sem_wait(&sem);
+ }
+
+ printf("Reader finished\n");
+ return NULL;
+}
+
+static void*
+writer(void* ZIX_UNUSED(arg))
+{
+ printf("Writer starting\n");
+
+ for (unsigned i = 0; i < n_signals; ++i) {
+ zix_sem_post(&sem);
+ }
+
+ printf("Writer finished\n");
+ return NULL;
+}
+
+int
+main(int argc, char** argv)
+{
+ if (argc > 2) {
+ printf("Usage: %s N_SIGNALS\n", argv[0]);
+ return 1;
+ }
+
+ if (argc > 1) {
+ n_signals = (unsigned)strtol(argv[1], NULL, 10);
+ }
+
+ printf("Testing %u signals...\n", n_signals);
+
+ assert(!zix_sem_init(&sem, 0));
+
+ ZixThread reader_thread; // NOLINT
+ assert(!zix_thread_create(&reader_thread, 128, reader, NULL));
+
+ ZixThread writer_thread; // NOLINT
+ assert(!zix_thread_create(&writer_thread, 128, writer, NULL));
+
+ zix_thread_join(reader_thread, NULL);
+ zix_thread_join(writer_thread, NULL);
+
+ zix_sem_destroy(&sem);
+ return 0;
+}