1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifndef MCA_PMIX_PMIX2X_H
18 #define MCA_PMIX_PMIX2X_H
19
20 #include "opal_config.h"
21
22 #ifdef HAVE_SYS_SOCKET_H
23 #include <sys/socket.h>
24 #endif
25 #ifdef HAVE_SYS_UN_H
26 #include <sys/un.h>
27 #endif
28
29 #include "opal/class/opal_list.h"
30 #include "opal/mca/mca.h"
31 #include "opal/mca/event/event.h"
32 #include "opal/util/proc.h"
33
34 #include "opal/mca/pmix/base/base.h"
35 #include "pmix_server.h"
36 #include "pmix_common.h"
37
38 BEGIN_C_DECLS
39
40 #ifdef OPAL_C_HAVE_VISIBILITY
41 #define PMIX_HAVE_VISIBILITY 1
42 #else
43 #undef PMIX_HAVE_VISIBILITY
44 #endif
45
46 typedef struct {
47 opal_pmix_base_component_t super;
48 bool legacy_get;
49 opal_list_t jobids;
50 bool native_launch;
51 size_t evindex;
52 opal_list_t events;
53 int cache_size;
54 opal_list_t cache;
55 opal_list_t dmdx;
56 bool silence_warning;
57 } mca_pmix_ext2x_component_t;
58
59 OPAL_DECLSPEC extern mca_pmix_ext2x_component_t mca_pmix_ext2x_component;
60
61 OPAL_DECLSPEC extern const opal_pmix_base_module_t opal_pmix_ext2x_module;
62
63
64 typedef struct {
65 opal_list_item_t super;
66 opal_jobid_t jobid;
67 char nspace[PMIX_MAX_NSLEN + 1];
68 } opal_ext2x_jobid_trkr_t;
69 OBJ_CLASS_DECLARATION(opal_ext2x_jobid_trkr_t);
70
71 typedef struct {
72 opal_list_item_t super;
73 opal_pmix_lock_t lock;
74 size_t index;
75 opal_pmix_notification_fn_t handler;
76 void *cbdata;
77 } opal_ext2x_event_t;
78 OBJ_CLASS_DECLARATION(opal_ext2x_event_t);
79
80 typedef struct {
81 opal_list_item_t super;
82 char *nspace;
83 pmix_modex_cbfunc_t cbfunc;
84 void *cbdata;
85 } opal_ext2x_dmx_trkr_t;
86 OBJ_CLASS_DECLARATION(opal_ext2x_dmx_trkr_t);
87
88 typedef struct {
89 opal_object_t super;
90 opal_event_t ev;
91 pmix_status_t status;
92 char *nspace;
93 pmix_proc_t p;
94 pmix_proc_t *procs;
95 size_t nprocs;
96 pmix_pdata_t *pdata;
97 size_t npdata;
98 pmix_proc_t *error_procs;
99 size_t nerror_procs;
100 pmix_info_t *info;
101 size_t ninfo;
102 pmix_app_t *apps;
103 size_t sz;
104 opal_pmix_lock_t lock;
105 opal_list_t *codes;
106 pmix_status_t *pcodes;
107 size_t ncodes;
108 pmix_query_t *queries;
109 size_t nqueries;
110 opal_ext2x_event_t *event;
111 opal_pmix_op_cbfunc_t opcbfunc;
112 opal_pmix_modex_cbfunc_t mdxcbfunc;
113 opal_pmix_value_cbfunc_t valcbfunc;
114 opal_pmix_lookup_cbfunc_t lkcbfunc;
115 opal_pmix_spawn_cbfunc_t spcbfunc;
116 opal_pmix_evhandler_reg_cbfunc_t evregcbfunc;
117 opal_pmix_info_cbfunc_t qcbfunc;
118 void *cbdata;
119 } ext2x_opcaddy_t;
120 OBJ_CLASS_DECLARATION(ext2x_opcaddy_t);
121
122 typedef struct {
123 opal_object_t super;
124 opal_list_t procs;
125 opal_list_t info;
126 opal_list_t apps;
127 pmix_op_cbfunc_t opcbfunc;
128 pmix_dmodex_response_fn_t dmdxfunc;
129 pmix_modex_cbfunc_t mdxcbfunc;
130 pmix_lookup_cbfunc_t lkupcbfunc;
131 pmix_spawn_cbfunc_t spwncbfunc;
132 pmix_info_cbfunc_t infocbfunc;
133 pmix_tool_connection_cbfunc_t toolcbfunc;
134 void *cbdata;
135 opal_pmix_release_cbfunc_t odmdxfunc;
136 void *ocbdata;
137 } ext2x_opalcaddy_t;
138 OBJ_CLASS_DECLARATION(ext2x_opalcaddy_t);
139
140 typedef struct {
141 opal_object_t super;
142 opal_event_t ev;
143 opal_pmix_lock_t lock;
144 const char *msg;
145 char *strings;
146 size_t id;
147 int status;
148 opal_process_name_t pname;
149 opal_jobid_t jobid;
150 const opal_process_name_t *source;
151 opal_pmix_data_range_t range;
152 bool nondefault;
153 size_t handler;
154 opal_value_t *val;
155 opal_list_t *event_codes;
156 opal_list_t *info;
157 opal_list_t results;
158 opal_pmix_notification_fn_t evhandler;
159 opal_pmix_evhandler_reg_cbfunc_t cbfunc;
160 opal_pmix_op_cbfunc_t opcbfunc;
161 pmix_event_notification_cbfunc_fn_t pmixcbfunc;
162 opal_pmix_value_cbfunc_t valcbfunc;
163 opal_pmix_lookup_cbfunc_t lkcbfunc;
164 void *cbdata;
165 } ext2x_threadshift_t;
166 OBJ_CLASS_DECLARATION(ext2x_threadshift_t);
167
168 #define OPAL_PMIX_OP_THREADSHIFT(e, fn, cb, cd) \
169 do { \
170 ext2x_threadshift_t *_cd; \
171 _cd = OBJ_NEW(ext2x_threadshift_t); \
172 _cd->handler = (e); \
173 _cd->opcbfunc = (cb); \
174 _cd->cbdata = (cd); \
175 opal_event_assign(&((_cd)->ev), opal_pmix_base.evbase, \
176 -1, EV_WRITE, (fn), (_cd)); \
177 OPAL_POST_OBJECT(_cd); \
178 opal_event_active(&((_cd)->ev), EV_WRITE, 1); \
179 } while(0)
180
181 #define OPAL_PMIX_THREADSHIFT(e, i, eh, fn, cb, cd) \
182 do { \
183 ext2x_threadshift_t *_cd; \
184 _cd = OBJ_NEW(ext2x_threadshift_t); \
185 _cd->event_codes = (e); \
186 _cd->info = (i); \
187 _cd->evhandler = (eh); \
188 _cd->cbfunc = (cb); \
189 _cd->cbdata = (cd); \
190 opal_event_assign(&((_cd)->ev), opal_pmix_base.evbase, \
191 -1, EV_WRITE, (fn), (_cd)); \
192 OPAL_POST_OBJECT(_cd); \
193 opal_event_active(&((_cd)->ev), EV_WRITE, 1); \
194 } while(0)
195
196 #define OPAL_PMIX_NOTIFY_THREADSHIFT(s, sr, r, i, fn, cb, cd) \
197 do { \
198 ext2x_threadshift_t *_cd; \
199 _cd = OBJ_NEW(ext2x_threadshift_t); \
200 _cd->status = (s); \
201 _cd->source = (sr); \
202 _cd->range = (r); \
203 _cd->info = (i); \
204 _cd->opcbfunc = (cb); \
205 _cd->cbdata = (cd); \
206 opal_event_assign(&((_cd)->ev), opal_pmix_base.evbase, \
207 -1, EV_WRITE, (fn), (_cd)); \
208 OPAL_POST_OBJECT(_cd); \
209 opal_event_active(&((_cd)->ev), EV_WRITE, 1); \
210 } while(0)
211
212 #define OPAL_PMIX2X_THREADSHIFT(p, cb) \
213 do { \
214 opal_event_assign(&((p)->ev), opal_pmix_base.evbase, \
215 -1, EV_WRITE, (cb), (p)); \
216 OPAL_POST_OBJECT(p); \
217 opal_event_active(&((p)->ev), EV_WRITE, 1); \
218 } while(0)
219
220
221 OPAL_MODULE_DECLSPEC int ext2x_client_init(opal_list_t *ilist);
222 OPAL_MODULE_DECLSPEC int ext2x_client_finalize(void);
223 OPAL_MODULE_DECLSPEC int ext2x_initialized(void);
224 OPAL_MODULE_DECLSPEC int ext2x_abort(int flag, const char *msg,
225 opal_list_t *procs);
226 OPAL_MODULE_DECLSPEC int ext2x_commit(void);
227 OPAL_MODULE_DECLSPEC int ext2x_fence(opal_list_t *procs, int collect_data);
228 OPAL_MODULE_DECLSPEC int ext2x_fencenb(opal_list_t *procs, int collect_data,
229 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
230 OPAL_MODULE_DECLSPEC int ext2x_put(opal_pmix_scope_t scope,
231 opal_value_t *val);
232 OPAL_MODULE_DECLSPEC int ext2x_get(const opal_process_name_t *proc, const char *key,
233 opal_list_t *info, opal_value_t **val);
234 OPAL_MODULE_DECLSPEC int ext2x_getnb(const opal_process_name_t *proc, const char *key,
235 opal_list_t *info,
236 opal_pmix_value_cbfunc_t cbfunc, void *cbdata);
237 OPAL_MODULE_DECLSPEC int ext2x_publish(opal_list_t *info);
238 OPAL_MODULE_DECLSPEC int ext2x_publishnb(opal_list_t *info,
239 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
240 OPAL_MODULE_DECLSPEC int ext2x_lookup(opal_list_t *data, opal_list_t *info);
241 OPAL_MODULE_DECLSPEC int ext2x_lookupnb(char **keys, opal_list_t *info,
242 opal_pmix_lookup_cbfunc_t cbfunc, void *cbdata);
243 OPAL_MODULE_DECLSPEC int ext2x_unpublish(char **keys, opal_list_t *info);
244 OPAL_MODULE_DECLSPEC int ext2x_unpublishnb(char **keys, opal_list_t *info,
245 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
246 OPAL_MODULE_DECLSPEC int ext2x_spawn(opal_list_t *job_info, opal_list_t *apps, opal_jobid_t *jobid);
247 OPAL_MODULE_DECLSPEC int ext2x_spawnnb(opal_list_t *job_info, opal_list_t *apps,
248 opal_pmix_spawn_cbfunc_t cbfunc, void *cbdata);
249 OPAL_MODULE_DECLSPEC int ext2x_connect(opal_list_t *procs);
250 OPAL_MODULE_DECLSPEC int ext2x_connectnb(opal_list_t *procs,
251 opal_pmix_op_cbfunc_t cbfunc,
252 void *cbdata);
253 OPAL_MODULE_DECLSPEC int ext2x_disconnect(opal_list_t *procs);
254 OPAL_MODULE_DECLSPEC int ext2x_disconnectnb(opal_list_t *procs,
255 opal_pmix_op_cbfunc_t cbfunc,
256 void *cbdata);
257 OPAL_MODULE_DECLSPEC int ext2x_resolve_peers(const char *nodename, opal_jobid_t jobid,
258 opal_list_t *procs);
259 OPAL_MODULE_DECLSPEC int ext2x_resolve_nodes(opal_jobid_t jobid, char **nodelist);
260 OPAL_MODULE_DECLSPEC int ext2x_allocate(opal_pmix_alloc_directive_t directive,
261 opal_list_t *info,
262 opal_pmix_info_cbfunc_t cbfunc, void *cbdata);
263 OPAL_MODULE_DECLSPEC int ext2x_job_control(opal_list_t *targets,
264 opal_list_t *directives,
265 opal_pmix_info_cbfunc_t cbfunc, void *cbdata);
266
267
268 OPAL_MODULE_DECLSPEC int ext2x_tool_init(opal_list_t *info);
269 OPAL_MODULE_DECLSPEC int ext2x_tool_fini(void);
270
271
272 OPAL_MODULE_DECLSPEC int ext2x_store_local(const opal_process_name_t *proc,
273 opal_value_t *val);
274
275
276 OPAL_MODULE_DECLSPEC int ext2x_server_init(opal_pmix_server_module_t *module,
277 opal_list_t *info);
278 OPAL_MODULE_DECLSPEC int ext2x_server_finalize(void);
279 OPAL_MODULE_DECLSPEC int ext2x_server_gen_regex(const char *input, char **regex);
280 OPAL_MODULE_DECLSPEC int ext2x_server_gen_ppn(const char *input, char **ppn);
281 OPAL_MODULE_DECLSPEC int ext2x_server_register_nspace(opal_jobid_t jobid,
282 int nlocalprocs,
283 opal_list_t *info,
284 opal_pmix_op_cbfunc_t cbfunc,
285 void *cbdata);
286 OPAL_MODULE_DECLSPEC void ext2x_server_deregister_nspace(opal_jobid_t jobid,
287 opal_pmix_op_cbfunc_t cbfunc,
288 void *cbdata);
289 OPAL_MODULE_DECLSPEC int ext2x_server_register_client(const opal_process_name_t *proc,
290 uid_t uid, gid_t gid,
291 void *server_object,
292 opal_pmix_op_cbfunc_t cbfunc,
293 void *cbdata);
294 OPAL_MODULE_DECLSPEC void ext2x_server_deregister_client(const opal_process_name_t *proc,
295 opal_pmix_op_cbfunc_t cbfunc,
296 void *cbdata);
297 OPAL_MODULE_DECLSPEC int ext2x_server_setup_fork(const opal_process_name_t *proc, char ***env);
298 OPAL_MODULE_DECLSPEC int ext2x_server_dmodex(const opal_process_name_t *proc,
299 opal_pmix_modex_cbfunc_t cbfunc, void *cbdata);
300 OPAL_MODULE_DECLSPEC int ext2x_server_notify_event(int status,
301 const opal_process_name_t *source,
302 opal_list_t *info,
303 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
304
305
306
307 OPAL_MODULE_DECLSPEC int opal_pmix_ext2x_check_evars(void);
308
309 OPAL_MODULE_DECLSPEC void ext2x_event_hdlr(size_t evhdlr_registration_id,
310 pmix_status_t status, const pmix_proc_t *source,
311 pmix_info_t info[], size_t ninfo,
312 pmix_info_t results[], size_t nresults,
313 pmix_event_notification_cbfunc_fn_t cbfunc,
314 void *cbdata);
315 OPAL_MODULE_DECLSPEC pmix_status_t ext2x_convert_opalrc(int rc);
316 OPAL_MODULE_DECLSPEC int ext2x_convert_rc(pmix_status_t rc);
317
318 OPAL_MODULE_DECLSPEC opal_vpid_t ext2x_convert_rank(pmix_rank_t rank);
319 OPAL_MODULE_DECLSPEC pmix_rank_t ext2x_convert_opalrank(opal_vpid_t vpid);
320
321 OPAL_MODULE_DECLSPEC opal_pmix_scope_t ext2x_convert_scope(pmix_scope_t scope);
322 OPAL_MODULE_DECLSPEC pmix_scope_t ext2x_convert_opalscope(opal_pmix_scope_t scope);
323
324 OPAL_MODULE_DECLSPEC pmix_data_range_t ext2x_convert_opalrange(opal_pmix_data_range_t range);
325 OPAL_MODULE_DECLSPEC opal_pmix_data_range_t ext2x_convert_range(pmix_data_range_t range);
326
327 OPAL_MODULE_DECLSPEC opal_pmix_persistence_t ext2x_convert_persist(pmix_persistence_t scope);
328 OPAL_MODULE_DECLSPEC pmix_persistence_t ext2x_convert_opalpersist(opal_pmix_persistence_t scope);
329
330 OPAL_MODULE_DECLSPEC void ext2x_value_load(pmix_value_t *v,
331 opal_value_t *kv);
332 OPAL_MODULE_DECLSPEC int ext2x_value_unload(opal_value_t *kv,
333 const pmix_value_t *v);
334
335 OPAL_MODULE_DECLSPEC opal_pmix_alloc_directive_t ext2x_convert_allocdir(pmix_alloc_directive_t dir);
336
337 OPAL_MODULE_DECLSPEC char* ext2x_convert_jobid(opal_jobid_t jobid);
338
339 END_C_DECLS
340
341 #endif