1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <errno.h>
21: #include "pthreadP.h"
22: #include <lowlevellock.h>
23: #include <kernel-features.h>
24:
25:
26: static const struct pthread_barrierattr default_attr =
27: {
28: .pshared = PTHREAD_PROCESS_PRIVATE
29: };
30:
31:
32: int
33: pthread_barrier_init (barrier, attr, count)
34: pthread_barrier_t *barrier;
35: const pthread_barrierattr_t *attr;
36: unsigned int count;
37: {
38: struct pthread_barrier *ibarrier;
39:
40: if (__builtin_expect (count == 0, 0))
41: return EINVAL;
42:
43: const struct pthread_barrierattr *iattr
44: = (attr != NULL
45: ? iattr = (struct pthread_barrierattr *) attr
46: : &default_attr);
47:
48: if (iattr->pshared != PTHREAD_PROCESS_PRIVATE
49: && __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0))
50:
51: return EINVAL;
52:
53: ibarrier = (struct pthread_barrier *) barrier;
54:
55:
56: ibarrier->lock = LLL_LOCK_INITIALIZER;
57: ibarrier->left = count;
58: ibarrier->init_count = count;
59: ibarrier->curr_event = 0;
60:
61: #ifdef __ASSUME_PRIVATE_FUTEX
62: ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE
63: ? 0 : FUTEX_PRIVATE_FLAG);
64: #else
65: ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE
66: ? 0 : THREAD_GETMEM (THREAD_SELF,
67: header.private_futex));
68: #endif
69:
70: return 0;
71: }