This source file includes following definitions.
- pmix_sync_wait_mt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include "wait_sync.h"
16
17 static pmix_mutex_t wait_sync_lock = PMIX_MUTEX_STATIC_INIT;
18 static pmix_wait_sync_t* wait_sync_list = NULL;
19
20 #define PMIX_WAIT_SYNC_PASS_OWNERSHIP(who) \
21 do { \
22 pthread_mutex_lock( &(who)->lock); \
23 pthread_cond_signal( &(who)->condition ); \
24 pthread_mutex_unlock( &(who)->lock); \
25 } while(0)
26
27 int pmix_sync_wait_mt(pmix_wait_sync_t *sync)
28 {
29
30
31
32
33 if(sync->count <= 0)
34 return (0 == sync->status) ? PMIX_SUCCESS : PMIX_ERROR;
35
36
37 pthread_mutex_lock(&sync->lock);
38
39
40
41
42 if(sync->count <= 0) {
43 pthread_mutex_unlock(&sync->lock);
44 return (0 == sync->status) ? PMIX_SUCCESS : PMIX_ERROR;
45 }
46
47
48 pmix_mutex_lock(&wait_sync_lock);
49 if( NULL == wait_sync_list ) {
50 sync->next = sync->prev = sync;
51 wait_sync_list = sync;
52 } else {
53 sync->prev = wait_sync_list->prev;
54 sync->prev->next = sync;
55 sync->next = wait_sync_list;
56 wait_sync_list->prev = sync;
57 }
58 pmix_mutex_unlock(&wait_sync_lock);
59
60
61
62
63
64
65 check_status:
66 if( sync != wait_sync_list ) {
67 pthread_cond_wait(&sync->condition, &sync->lock);
68
69
70
71
72
73
74
75 if( sync->count <= 0 ) {
76 pthread_mutex_unlock(&sync->lock);
77 goto i_am_done;
78 }
79
80 goto check_status;
81 }
82
83 pthread_mutex_unlock(&sync->lock);
84 while(sync->count > 0) {
85 }
86 assert(sync == wait_sync_list);
87
88 i_am_done:
89
90 pmix_mutex_lock(&wait_sync_lock);
91 sync->prev->next = sync->next;
92 sync->next->prev = sync->prev;
93
94 if( sync == wait_sync_list ) {
95 wait_sync_list = (sync == sync->next) ? NULL : sync->next;
96 if( NULL != wait_sync_list )
97 PMIX_WAIT_SYNC_PASS_OWNERSHIP(wait_sync_list);
98 }
99 pmix_mutex_unlock(&wait_sync_lock);
100
101 return (0 == sync->status) ? PMIX_SUCCESS : PMIX_ERROR;
102 }