This source file includes following definitions.
- infocbfunc
- 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 #include <stdbool.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <unistd.h>
30 #include <time.h>
31
32 #include <pmix.h>
33 #include "examples.h"
34
35
36
37
38
39
40
41
42
43
44
45
46
47 static void infocbfunc(pmix_status_t status,
48 pmix_info_t *info, size_t ninfo,
49 void *cbdata,
50 pmix_release_cbfunc_t release_fn,
51 void *release_cbdata)
52 {
53 myquery_data_t *mq = (myquery_data_t*)cbdata;
54 size_t n;
55
56 fprintf(stderr, "Allocation request returned %s", PMIx_Error_string(status));
57
58
59
60
61 if (0 < ninfo) {
62 PMIX_INFO_CREATE(mq->info, ninfo);
63 mq->ninfo = ninfo;
64 for (n=0; n < ninfo; n++) {
65 fprintf(stderr, "Transferring %s\n", info[n].key);
66 PMIX_INFO_XFER(&mq->info[n], &info[n]);
67 }
68 }
69
70
71 mq->lock.status = status;
72
73
74
75 if (NULL != release_fn) {
76 release_fn(release_cbdata);
77 }
78
79
80 DEBUG_WAKEUP_THREAD(&mq->lock);
81 }
82
83
84
85
86
87
88
89 static void release_fn(size_t evhdlr_registration_id,
90 pmix_status_t status,
91 const pmix_proc_t *source,
92 pmix_info_t info[], size_t ninfo,
93 pmix_info_t results[], size_t nresults,
94 pmix_event_notification_cbfunc_fn_t cbfunc,
95 void *cbdata)
96 {
97 myrel_t *lock;
98 size_t n;
99
100
101 lock = NULL;
102 for (n=0; n < ninfo; n++) {
103 if (0 == strncmp(info[n].key, PMIX_EVENT_RETURN_OBJECT, PMIX_MAX_KEYLEN)) {
104 lock = (myrel_t*)info[n].value.data.ptr;
105 break;
106 }
107 }
108
109 if (NULL == lock) {
110 fprintf(stderr, "LOCK WASN'T RETURNED IN RELEASE CALLBACK\n");
111
112 if (NULL != cbfunc) {
113 cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
114 }
115 return;
116 }
117
118
119 if (NULL != cbfunc) {
120 cbfunc(PMIX_EVENT_ACTION_COMPLETE, NULL, 0, NULL, NULL, cbdata);
121 }
122
123
124
125 lock->lock.status = PMIX_SUCCESS;
126
127 DEBUG_WAKEUP_THREAD(&lock->lock);
128 }
129
130
131
132
133
134
135
136
137 static void evhandler_reg_callbk(pmix_status_t status,
138 size_t evhandler_ref,
139 void *cbdata)
140 {
141 mylock_t *lock = (mylock_t*)cbdata;
142
143 if (PMIX_SUCCESS != status) {
144 fprintf(stderr, "EVENT HANDLER REGISTRATION FAILED WITH STATUS %d, ref=%lu\n",
145 status, (unsigned long)evhandler_ref);
146 }
147 lock->status = status;
148 lock->evhandler_ref = evhandler_ref;
149 DEBUG_WAKEUP_THREAD(lock);
150 }
151
152 int main(int argc, char **argv)
153 {
154 pmix_proc_t myproc;
155 int rc;
156 pmix_value_t value;
157 pmix_value_t *val = &value;
158 pmix_proc_t proc;
159 uint32_t nprocs;
160 pmix_info_t *info;
161 uint64_t nnodes = 12;
162 myquery_data_t mydata;
163 pmix_query_t *query;
164 char *myallocation = "MYALLOCATION";
165 mylock_t mylock;
166 pmix_status_t code;
167 myrel_t myrel;
168
169
170 if (PMIX_SUCCESS != (rc = PMIx_Init(&myproc, NULL, 0))) {
171 fprintf(stderr, "Client ns %s rank %d: PMIx_Init failed: %d\n", myproc.nspace, myproc.rank, rc);
172 exit(0);
173 }
174 fprintf(stderr, "Client ns %s rank %d: Running\n", myproc.nspace, myproc.rank);
175
176
177 PMIX_PROC_CONSTRUCT(&proc);
178 (void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
179 proc.rank = PMIX_RANK_WILDCARD;
180 if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
181 fprintf(stderr, "Client ns %s rank %d: PMIx_Get universe size failed: %d\n", myproc.nspace, myproc.rank, rc);
182 goto done;
183 }
184 nprocs = val->data.uint32;
185 PMIX_VALUE_RELEASE(val);
186 fprintf(stderr, "Client %s:%d universe size %d\n", myproc.nspace, myproc.rank, nprocs);
187
188 if (0 == myproc.rank) {
189
190 DEBUG_CONSTRUCT_MYQUERY(&mydata);
191 PMIX_INFO_CREATE(info, 2);
192 PMIX_INFO_LOAD(&info[0], PMIX_ALLOC_NUM_NODES, &nnodes, PMIX_UINT64);
193 PMIX_INFO_LOAD(&info[0], PMIX_ALLOC_ID, myallocation, PMIX_STRING);
194 if (PMIX_SUCCESS != (rc = PMIx_Allocation_request_nb(PMIX_ALLOC_NEW, info, 2, infocbfunc, &mydata))) {
195 fprintf(stderr, "Client ns %s rank %d: PMIx_Allocation_request_nb failed: %d\n", myproc.nspace, myproc.rank, rc);
196 goto done;
197 }
198 DEBUG_WAIT_THREAD(&mydata.lock);
199 PMIX_INFO_FREE(info, 2);
200 fprintf(stderr, "Client ns %s rank %d: Allocation returned status: %s\n",
201 myproc.nspace, myproc.rank, PMIx_Error_string(mydata.lock.status));
202 DEBUG_DESTRUCT_MYQUERY(&mydata);
203
204 } else if (1 == myproc.rank) {
205
206
207 DEBUG_CONSTRUCT_MYREL(&myrel);
208 PMIX_INFO_CREATE(info, 2);
209 PMIX_INFO_LOAD(&info[0], PMIX_ALLOC_ID, myallocation, PMIX_STRING);
210 PMIX_INFO_LOAD(&info[1], PMIX_EVENT_RETURN_OBJECT, &myrel, PMIX_POINTER);
211 DEBUG_CONSTRUCT_LOCK(&mylock);
212 code = PMIX_NOTIFY_ALLOC_COMPLETE;
213 PMIx_Register_event_handler(&code, 1, info, 2,
214 release_fn, evhandler_reg_callbk, (void*)&mylock);
215 DEBUG_WAIT_THREAD(&mylock);
216 PMIX_INFO_FREE(info, 2);
217 rc = mylock.status;
218 DEBUG_DESTRUCT_LOCK(&mylock);
219
220
221 DEBUG_WAIT_THREAD(&myrel.lock);
222 fprintf(stderr, "[%s:%d] Allocation returned status: %s\n",
223 myproc.nspace, myproc.rank, PMIx_Error_string(myrel.lock.status));
224 DEBUG_DESTRUCT_MYREL(&myrel);
225
226 } else {
227
228
229 usleep(10);
230 DEBUG_CONSTRUCT_MYQUERY(&mydata);
231
232 PMIX_QUERY_CREATE(query, 1);
233 PMIX_ARGV_APPEND(rc, query[0].keys, PMIX_QUERY_ALLOC_STATUS);
234 PMIX_INFO_CREATE(query[0].qualifiers, 1);
235 PMIX_INFO_LOAD(&query[0].qualifiers[0], PMIX_ALLOC_ID, myallocation, PMIX_STRING);
236
237 if (PMIX_SUCCESS != (rc = PMIx_Query_info_nb(query, 1, infocbfunc, (void*)&mydata))) {
238 fprintf(stderr, "PMIx_Query_info failed: %d\n", rc);
239 goto done;
240 }
241 DEBUG_WAIT_THREAD(&mydata.lock);
242 PMIX_QUERY_FREE(query, 1);
243 fprintf(stderr, "[%s:%d] Allocation returned status: %s\n",
244 myproc.nspace, myproc.rank, PMIx_Error_string(mydata.lock.status));
245 DEBUG_DESTRUCT_MYQUERY(&mydata);
246 }
247
248 done:
249
250 fprintf(stderr, "Client ns %s rank %d: Finalizing\n", myproc.nspace, myproc.rank);
251 if (PMIX_SUCCESS != (rc = PMIx_Finalize(NULL, 0))) {
252 fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize failed: %d\n", myproc.nspace, myproc.rank, rc);
253 } else {
254 fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize successfully completed\n", myproc.nspace, myproc.rank);
255 }
256 fflush(stderr);
257 return(0);
258 }