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
11void *
12foo(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
22int 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