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 *
foo(void * arg)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
main()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