summaryrefslogtreecommitdiff
path: root/regress/lib/libpthread
diff options
context:
space:
mode:
Diffstat (limited to 'regress/lib/libpthread')
-rw-r--r--regress/lib/libpthread/Makefile4
-rw-r--r--regress/lib/libpthread/spinlock/Makefile5
-rw-r--r--regress/lib/libpthread/spinlock/spinlock.c50
3 files changed, 57 insertions, 2 deletions
diff --git a/regress/lib/libpthread/Makefile b/regress/lib/libpthread/Makefile
index 8b5f85d70de..5d42f1ef5cc 100644
--- a/regress/lib/libpthread/Makefile
+++ b/regress/lib/libpthread/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.38 2012/04/13 19:04:09 kurt Exp $
+# $OpenBSD: Makefile,v 1.39 2012/05/03 09:07:17 pirofti Exp $
# disabled because it requires a buggy behavior that uthread had:
# dup2_race
@@ -11,7 +11,7 @@ SUBDIR= barrier blocked_close blocked_dup2 blocked_fifo blocked_shutdown \
pthread_rwlock pthread_specific \
readdir restart select semaphore setjmp setsockopt sigdeliver siginfo \
siginterrupt signal signals signodefer sigsuspend sigwait sleep \
- socket stack stdarg stdio switch system
+ socket spinlock stack stdarg stdio switch system
# Not available or disabled: fcntl, getaddrinfo, pause, pw, sigmask, stdfiles
diff --git a/regress/lib/libpthread/spinlock/Makefile b/regress/lib/libpthread/spinlock/Makefile
new file mode 100644
index 00000000000..0c029e43dc0
--- /dev/null
+++ b/regress/lib/libpthread/spinlock/Makefile
@@ -0,0 +1,5 @@
+# $OpenBSD: Makefile,v 1.1 2012/05/03 09:07:17 pirofti Exp $
+
+PROG= spinlock
+
+.include <bsd.regress.mk>
diff --git a/regress/lib/libpthread/spinlock/spinlock.c b/regress/lib/libpthread/spinlock/spinlock.c
new file mode 100644
index 00000000000..dadfe14d1f0
--- /dev/null
+++ b/regress/lib/libpthread/spinlock/spinlock.c
@@ -0,0 +1,50 @@
+/* $OpenBSD: spinlock.c,v 1.1 2012/05/03 09:07:17 pirofti Exp $ */
+/* Paul Irofti <pirofti@openbsd.org>, 2012. Public Domain. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <errno.h>
+#include <pthread.h>
+#include <unistd.h>
+
+#include "test.h"
+
+void *
+foo(void *arg)
+{
+ int rc = 0;
+ pthread_spinlock_t l = (pthread_spinlock_t)arg;
+ rc = pthread_spin_trylock(&l);
+ if (rc != 0 && rc != EBUSY) {
+ PANIC("pthread_trylock returned %d", rc);
+ }
+ if (rc == 0) {
+ CHECKr(pthread_spin_unlock(&l));
+ }
+ CHECKr(pthread_spin_lock(&l));
+ CHECKr(pthread_spin_unlock(&l));
+ return NULL;
+}
+
+int main()
+{
+ int i;
+ pthread_t thr[10];
+ pthread_spinlock_t l;
+
+ _CHECK(pthread_spin_init(&l, PTHREAD_PROCESS_SHARED), == ENOTSUP,
+ strerror(_x));
+
+ CHECKr(pthread_spin_init(&l, PTHREAD_PROCESS_PRIVATE));
+ for (i = 0; i < 10; i++) {
+ printf("Thread %d started\n", i);
+ CHECKr(pthread_create(&thr[i], NULL, foo, (void *)l));
+ }
+ for (i = 0; i < 10; i++) {
+ CHECKr(pthread_join(thr[i], NULL));
+ }
+ CHECKr(pthread_spin_destroy(&l));
+
+ SUCCEED;
+}