1 /* $OpenBSD: spinlock.c,v 1.2 2020/04/06 00:01:08 pirofti Exp $ */ 2 /* Paul Irofti <paul@irofti.net>, 2012. Public Domain. */ 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 #include <errno.h> 8 #include <pthread.h> 9 #include <unistd.h> 10 11 #include "test.h" 12 13 void * 14 foo(void *arg) 15 { 16 int rc = 0; 17 pthread_spinlock_t l = (pthread_spinlock_t)arg; 18 rc = pthread_spin_trylock(&l); 19 if (rc != 0 && rc != EBUSY) { 20 PANIC("pthread_trylock returned %d", rc); 21 } 22 if (rc == 0) { 23 CHECKr(pthread_spin_unlock(&l)); 24 } 25 CHECKr(pthread_spin_lock(&l)); 26 CHECKr(pthread_spin_unlock(&l)); 27 return NULL; 28 } 29 30 int main() 31 { 32 int i; 33 pthread_t thr[10]; 34 pthread_spinlock_t l; 35 36 _CHECK(pthread_spin_init(&l, PTHREAD_PROCESS_SHARED), == ENOTSUP, 37 strerror(_x)); 38 39 CHECKr(pthread_spin_init(&l, PTHREAD_PROCESS_PRIVATE)); 40 for (i = 0; i < 10; i++) { 41 printf("Thread %d started\n", i); 42 CHECKr(pthread_create(&thr[i], NULL, foo, (void *)l)); 43 } 44 for (i = 0; i < 10; i++) { 45 CHECKr(pthread_join(thr[i], NULL)); 46 } 47 CHECKr(pthread_spin_destroy(&l)); 48 49 SUCCEED; 50 } 51