xref: /openbsd-src/regress/lib/libpthread/spinlock/spinlock.c (revision 8855e28c066fcedf8b2ce6df476d3f9b3d0ee8f9)
1*8855e28cSpirofti /*	$OpenBSD: spinlock.c,v 1.2 2020/04/06 00:01:08 pirofti Exp $	*/
2*8855e28cSpirofti /* Paul Irofti <paul@irofti.net>, 2012. Public Domain. */
35037ac14Spirofti 
45037ac14Spirofti #include <stdio.h>
55037ac14Spirofti #include <stdlib.h>
65037ac14Spirofti 
75037ac14Spirofti #include <errno.h>
85037ac14Spirofti #include <pthread.h>
95037ac14Spirofti #include <unistd.h>
105037ac14Spirofti 
115037ac14Spirofti #include "test.h"
125037ac14Spirofti 
135037ac14Spirofti void *
foo(void * arg)145037ac14Spirofti foo(void *arg)
155037ac14Spirofti {
165037ac14Spirofti 	int rc = 0;
175037ac14Spirofti 	pthread_spinlock_t l = (pthread_spinlock_t)arg;
185037ac14Spirofti 	rc = pthread_spin_trylock(&l);
195037ac14Spirofti 	if (rc != 0 && rc != EBUSY) {
205037ac14Spirofti 		PANIC("pthread_trylock returned %d", rc);
215037ac14Spirofti 	}
225037ac14Spirofti 	if (rc == 0) {
235037ac14Spirofti 		CHECKr(pthread_spin_unlock(&l));
245037ac14Spirofti 	}
255037ac14Spirofti 	CHECKr(pthread_spin_lock(&l));
265037ac14Spirofti 	CHECKr(pthread_spin_unlock(&l));
275037ac14Spirofti 	return NULL;
285037ac14Spirofti }
295037ac14Spirofti 
main()305037ac14Spirofti int main()
315037ac14Spirofti {
325037ac14Spirofti 	int i;
335037ac14Spirofti 	pthread_t thr[10];
345037ac14Spirofti 	pthread_spinlock_t l;
355037ac14Spirofti 
365037ac14Spirofti 	_CHECK(pthread_spin_init(&l, PTHREAD_PROCESS_SHARED), == ENOTSUP,
375037ac14Spirofti 	    strerror(_x));
385037ac14Spirofti 
395037ac14Spirofti 	CHECKr(pthread_spin_init(&l, PTHREAD_PROCESS_PRIVATE));
405037ac14Spirofti 	for (i = 0; i < 10; i++) {
415037ac14Spirofti 		printf("Thread %d started\n", i);
425037ac14Spirofti 		CHECKr(pthread_create(&thr[i], NULL, foo, (void *)l));
435037ac14Spirofti 	}
445037ac14Spirofti 	for (i = 0; i < 10; i++) {
455037ac14Spirofti 		CHECKr(pthread_join(thr[i], NULL));
465037ac14Spirofti 	}
475037ac14Spirofti 	CHECKr(pthread_spin_destroy(&l));
485037ac14Spirofti 
495037ac14Spirofti 	SUCCEED;
505037ac14Spirofti }
51