This source file includes following definitions.
- opal_condition_wait
- opal_condition_timedwait
- opal_condition_signal
- opal_condition_broadcast
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef OPAL_CONDITION_SPINLOCK_H
23 #define OPAL_CONDITION_SPINLOCK_H
24
25 #include "opal_config.h"
26 #ifdef HAVE_SYS_TIME_H
27 #include <sys/time.h>
28 #endif
29 #include <time.h>
30 #include <pthread.h>
31
32 #include "opal/threads/mutex.h"
33 #include "opal/runtime/opal_progress.h"
34
35 #include "opal/runtime/opal_cr.h"
36
37 BEGIN_C_DECLS
38
39
40
41
42
43
44 struct opal_condition_t {
45 opal_object_t super;
46 volatile int c_waiting;
47 volatile int c_signaled;
48 };
49 typedef struct opal_condition_t opal_condition_t;
50
51 OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_condition_t);
52
53
54 static inline int opal_condition_wait(opal_condition_t *c, opal_mutex_t *m)
55 {
56 int rc = 0;
57 c->c_waiting++;
58
59 if (opal_using_threads()) {
60 if (c->c_signaled) {
61 c->c_waiting--;
62 opal_mutex_unlock(m);
63 opal_progress();
64 OPAL_CR_TEST_CHECKPOINT_READY_STALL();
65 opal_mutex_lock(m);
66 return 0;
67 }
68 while (c->c_signaled == 0) {
69 opal_mutex_unlock(m);
70 opal_progress();
71 OPAL_CR_TEST_CHECKPOINT_READY_STALL();
72 opal_mutex_lock(m);
73 }
74 } else {
75 while (c->c_signaled == 0) {
76 opal_progress();
77 OPAL_CR_TEST_CHECKPOINT_READY_STALL();
78 }
79 }
80
81 c->c_signaled--;
82 c->c_waiting--;
83 return rc;
84 }
85
86 static inline int opal_condition_timedwait(opal_condition_t *c,
87 opal_mutex_t *m,
88 const struct timespec *abstime)
89 {
90 struct timeval tv;
91 struct timeval absolute;
92 int rc = 0;
93
94 c->c_waiting++;
95 if (opal_using_threads()) {
96 absolute.tv_sec = abstime->tv_sec;
97 absolute.tv_usec = abstime->tv_nsec / 1000;
98 gettimeofday(&tv,NULL);
99 if (c->c_signaled == 0) {
100 do {
101 opal_mutex_unlock(m);
102 opal_progress();
103 gettimeofday(&tv,NULL);
104 opal_mutex_lock(m);
105 } while (c->c_signaled == 0 &&
106 (tv.tv_sec <= absolute.tv_sec ||
107 (tv.tv_sec == absolute.tv_sec && tv.tv_usec < absolute.tv_usec)));
108 }
109 } else {
110 absolute.tv_sec = abstime->tv_sec;
111 absolute.tv_usec = abstime->tv_nsec / 1000;
112 gettimeofday(&tv,NULL);
113 if (c->c_signaled == 0) {
114 do {
115 opal_progress();
116 gettimeofday(&tv,NULL);
117 } while (c->c_signaled == 0 &&
118 (tv.tv_sec <= absolute.tv_sec ||
119 (tv.tv_sec == absolute.tv_sec && tv.tv_usec < absolute.tv_usec)));
120 }
121 }
122
123 if (c->c_signaled != 0) c->c_signaled--;
124 c->c_waiting--;
125 return rc;
126 }
127
128 static inline int opal_condition_signal(opal_condition_t *c)
129 {
130 if (c->c_waiting) {
131 c->c_signaled++;
132 }
133 return 0;
134 }
135
136 static inline int opal_condition_broadcast(opal_condition_t *c)
137 {
138 c->c_signaled = c->c_waiting;
139 return 0;
140 }
141
142 END_C_DECLS
143
144 #endif
145