This source file includes following definitions.
- notification_fn
- release_fn
- evhandler_reg_callbk
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #define _GNU_SOURCE
27 #include <stdbool.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <unistd.h>
31 #include <time.h>
32
33 #include <pmix.h>
34 #include "examples.h"
35
36 static pmix_proc_t myproc;
37
38
39
40
41
42 static void notification_fn(size_t evhdlr_registration_id,
43 pmix_status_t status,
44 const pmix_proc_t *source,
45 pmix_info_t info[], size_t ninfo,
46 pmix_info_t results[], size_t nresults,
47 pmix_event_notification_cbfunc_fn_t cbfunc,
48 void *cbdata)
49 {
50 if (NULL != cbfunc) {
51 cbfunc(PMIX_EVENT_ACTION_COMPLETE, NULL, 0, NULL, NULL, cbdata);
52 }
53 }
54
55
56
57
58
59
60
61 static void release_fn(size_t evhdlr_registration_id,
62 pmix_status_t status,
63 const pmix_proc_t *source,
64 pmix_info_t info[], size_t ninfo,
65 pmix_info_t results[], size_t nresults,
66 pmix_event_notification_cbfunc_fn_t cbfunc,
67 void *cbdata)
68 {
69 myrel_t *lock;
70 size_t n;
71
72
73 lock = NULL;
74 for (n=0; n < ninfo; n++) {
75 if (0 == strncmp(info[n].key, PMIX_EVENT_RETURN_OBJECT, PMIX_MAX_KEYLEN)) {
76 lock = (myrel_t*)info[n].value.data.ptr;
77 break;
78 }
79 }
80
81 if (NULL == lock) {
82 fprintf(stderr, "LOCK WASN'T RETURNED IN RELEASE CALLBACK\n");
83
84 if (NULL != cbfunc) {
85 cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
86 }
87 return;
88 }
89
90
91 if (NULL != cbfunc) {
92 cbfunc(PMIX_EVENT_ACTION_COMPLETE, NULL, 0, NULL, NULL, cbdata);
93 }
94
95
96 lock->lock.status = PMIX_SUCCESS;
97
98 DEBUG_WAKEUP_THREAD(&lock->lock);
99 }
100
101
102
103
104
105
106
107
108 static void evhandler_reg_callbk(pmix_status_t status,
109 size_t evhandler_ref,
110 void *cbdata)
111 {
112 mylock_t *lock = (mylock_t*)cbdata;
113
114 if (PMIX_SUCCESS != status) {
115 fprintf(stderr, "Client %s:%d EVENT HANDLER REGISTRATION FAILED WITH STATUS %d, ref=%lu\n",
116 myproc.nspace, myproc.rank, status, (unsigned long)evhandler_ref);
117 }
118 lock->status = status;
119 lock->evhandler_ref = evhandler_ref;
120 DEBUG_WAKEUP_THREAD(lock);
121 }
122
123 int main(int argc, char **argv)
124 {
125 pmix_status_t rc;
126 pmix_value_t value;
127 pmix_value_t *val = &value;
128 char *tmp;
129 pmix_proc_t proc;
130 uint32_t nprocs, n;
131 pmix_info_t *info;
132 bool flag;
133 mylock_t mylock;
134 myrel_t myrel;
135 pmix_status_t dbg = PMIX_ERR_DEBUGGER_RELEASE;
136 pid_t pid;
137
138 pid = getpid();
139 fprintf(stderr, "Client %lu: Running\n", (unsigned long)pid);
140
141
142
143
144
145
146 if (PMIX_SUCCESS != (rc = PMIx_Init(&myproc, NULL, 0))) {
147 fprintf(stderr, "Client ns %s rank %d: PMIx_Init failed: %d\n", myproc.nspace, myproc.rank, rc);
148 exit(0);
149 }
150 fprintf(stderr, "Client ns %s rank %d pid %lu: Running\n", myproc.nspace, myproc.rank, (unsigned long)pid);
151
152
153
154
155 DEBUG_CONSTRUCT_LOCK(&mylock);
156 PMIx_Register_event_handler(NULL, 0, NULL, 0,
157 notification_fn, evhandler_reg_callbk, (void*)&mylock);
158 DEBUG_WAIT_THREAD(&mylock);
159 rc = mylock.status;
160 DEBUG_DESTRUCT_LOCK(&mylock);
161
162 if (PMIX_SUCCESS != rc) {
163 fprintf(stderr, "[%s:%d] Default handler registration failed\n", myproc.nspace, myproc.rank);
164 goto done;
165 }
166
167
168
169
170 PMIX_PROC_CONSTRUCT(&proc);
171 (void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
172 proc.rank = PMIX_RANK_WILDCARD;
173
174
175
176
177
178
179
180 if (PMIX_SUCCESS == (rc = PMIx_Get(&proc, PMIX_DEBUG_WAIT_FOR_NOTIFY, NULL, 0, &val))) {
181
182 DEBUG_CONSTRUCT_LOCK(&mylock);
183 PMIX_INFO_CREATE(info, 1);
184 DEBUG_CONSTRUCT_MYREL(&myrel);
185 PMIX_INFO_LOAD(&info[0], PMIX_EVENT_RETURN_OBJECT, &myrel, PMIX_POINTER);
186 PMIx_Register_event_handler(&dbg, 1, info, 1,
187 release_fn, evhandler_reg_callbk, (void*)&mylock);
188
189 DEBUG_WAIT_THREAD(&mylock);
190 rc = mylock.status;
191 DEBUG_DESTRUCT_LOCK(&mylock);
192 PMIX_INFO_FREE(info, 1);
193 if (PMIX_SUCCESS != rc) {
194 fprintf(stderr, "[%s:%d] Debug handler registration failed\n", myproc.nspace, myproc.rank);
195 goto done;
196 }
197
198 DEBUG_WAIT_THREAD(&myrel.lock);
199 DEBUG_DESTRUCT_MYREL(&myrel);
200 }
201
202
203 if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
204 fprintf(stderr, "Client ns %s rank %d: PMIx_Get universe size failed: %d\n", myproc.nspace, myproc.rank, rc);
205 goto done;
206 }
207 fprintf(stderr, "Client %s:%d universe size %d\n", myproc.nspace, myproc.rank, val->data.uint32);
208
209
210 if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
211 fprintf(stderr, "Client ns %s rank %d: PMIx_Get job size failed: %d\n", myproc.nspace, myproc.rank, rc);
212 goto done;
213 }
214 nprocs = val->data.uint32;
215 PMIX_VALUE_RELEASE(val);
216 fprintf(stderr, "Client %s:%d num procs %d\n", myproc.nspace, myproc.rank, nprocs);
217
218
219 if (0 > asprintf(&tmp, "%s-%d-internal", myproc.nspace, myproc.rank)) {
220 exit(1);
221 }
222 value.type = PMIX_UINT32;
223 value.data.uint32 = 1234;
224 if (PMIX_SUCCESS != (rc = PMIx_Store_internal(&myproc, tmp, &value))) {
225 fprintf(stderr, "Client ns %s rank %d: PMIx_Store_internal failed: %d\n", myproc.nspace, myproc.rank, rc);
226 goto done;
227 }
228 free(tmp);
229
230 if (0 > asprintf(&tmp, "%s-%d-local", myproc.nspace, myproc.rank)) {
231 exit(1);
232 }
233 value.type = PMIX_UINT64;
234 value.data.uint64 = 1234;
235 if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_LOCAL, tmp, &value))) {
236 fprintf(stderr, "Client ns %s rank %d: PMIx_Put internal failed: %d\n", myproc.nspace, myproc.rank, rc);
237 goto done;
238 }
239 free(tmp);
240
241 if (0 > asprintf(&tmp, "%s-%d-remote", myproc.nspace, myproc.rank)) {
242 exit(1);
243 }
244 value.type = PMIX_STRING;
245 value.data.string = "1234";
246 if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_REMOTE, tmp, &value))) {
247 fprintf(stderr, "Client ns %s rank %d: PMIx_Put internal failed: %d\n", myproc.nspace, myproc.rank, rc);
248 goto done;
249 }
250 free(tmp);
251
252
253 if (PMIX_SUCCESS != (rc = PMIx_Commit())) {
254 fprintf(stderr, "Client ns %s rank %d: PMIx_Commit failed: %d\n", myproc.nspace, myproc.rank, rc);
255 goto done;
256 }
257
258
259
260
261 PMIX_INFO_CREATE(info, 1);
262 flag = true;
263 PMIX_INFO_LOAD(info, PMIX_COLLECT_DATA, &flag, PMIX_BOOL);
264 if (PMIX_SUCCESS != (rc = PMIx_Fence(&proc, 1, info, 1))) {
265 fprintf(stderr, "Client ns %s rank %d: PMIx_Fence failed: %d\n", myproc.nspace, myproc.rank, rc);
266 goto done;
267 }
268 PMIX_INFO_FREE(info, 1);
269
270
271 for (n=0; n < nprocs; n++) {
272 if (0 > asprintf(&tmp, "%s-%d-local", myproc.nspace, myproc.rank)) {
273 exit(1);
274 }
275 if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc, tmp, NULL, 0, &val))) {
276 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, myproc.rank, tmp, rc);
277 goto done;
278 }
279 if (PMIX_UINT64 != val->type) {
280 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s returned wrong type: %d\n", myproc.nspace, myproc.rank, tmp, val->type);
281 PMIX_VALUE_RELEASE(val);
282 free(tmp);
283 goto done;
284 }
285 if (1234 != val->data.uint64) {
286 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s returned wrong value: %d\n", myproc.nspace, myproc.rank, tmp, (int)val->data.uint64);
287 PMIX_VALUE_RELEASE(val);
288 free(tmp);
289 goto done;
290 }
291 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s returned correct\n", myproc.nspace, myproc.rank, tmp);
292 PMIX_VALUE_RELEASE(val);
293 free(tmp);
294 if (0 > asprintf(&tmp, "%s-%d-remote", myproc.nspace, myproc.rank)) {
295 exit(1);
296 }
297 if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc, tmp, NULL, 0, &val))) {
298 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, myproc.rank, tmp, rc);
299 goto done;
300 }
301 if (PMIX_STRING != val->type) {
302 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s returned wrong type: %d\n", myproc.nspace, myproc.rank, tmp, val->type);
303 PMIX_VALUE_RELEASE(val);
304 free(tmp);
305 goto done;
306 }
307 if (0 != strcmp(val->data.string, "1234")) {
308 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s returned wrong value: %s\n", myproc.nspace, myproc.rank, tmp, val->data.string);
309 PMIX_VALUE_RELEASE(val);
310 free(tmp);
311 goto done;
312 }
313 fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s returned correct\n", myproc.nspace, myproc.rank, tmp);
314 PMIX_VALUE_RELEASE(val);
315 free(tmp);
316 }
317
318 done:
319
320 fprintf(stderr, "Client ns %s rank %d: Finalizing\n", myproc.nspace, myproc.rank);
321 if (PMIX_SUCCESS != (rc = PMIx_Finalize(NULL, 0))) {
322 fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize failed: %d\n", myproc.nspace, myproc.rank, rc);
323 } else {
324 fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize successfully completed\n", myproc.nspace, myproc.rank);
325 }
326 fflush(stderr);
327 return(0);
328 }