1 /*	$OpenBSD: barrier.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 
6 #include <pthread.h>
7 #include <errno.h>
8 
9 #include "test.h"
10 
11 void *
12 foo(void *arg)
13 {
14 	int rc = 0;
15 	pthread_barrier_t b = (pthread_barrier_t)arg;
16 	rc = pthread_barrier_wait(&b);
17 	if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
18 		PANIC("pthread_barrier_wait returned %d", rc);
19 	return NULL;
20 }
21 
22 int main()
23 {
24 	int i;
25 	pthread_t thr[10];
26 	pthread_barrier_t b;
27 
28 	pthread_barrierattr_t attr;
29 	CHECKr(pthread_barrierattr_init(&attr));
30 	CHECKr(pthread_barrierattr_getpshared(&attr, &i));
31 	_CHECK(i, == PTHREAD_PROCESS_PRIVATE, strerror(_x));
32 	CHECKr(pthread_barrierattr_setpshared(&attr, i));
33 	_CHECK(pthread_barrierattr_setpshared(&attr, PTHREAD_PROCESS_SHARED), == ENOTSUP, strerror(_x));
34 
35 	CHECKr(pthread_barrier_init(&b, &attr, 10));
36 	for (i = 0; i < 10; i++) {
37 		printf("Thread %d started\n", i);
38 		CHECKr(pthread_create(&thr[i], NULL, foo, (void *)b));
39 	}
40 	for (i = 0; i < 10; i++) {
41 		CHECKr(pthread_join(thr[i], NULL));
42 	}
43 	CHECKr(pthread_barrierattr_destroy(&attr));
44 	CHECKr(pthread_barrier_destroy(&b));
45 
46 	SUCCEED;
47 }
48