File indexing completed on 2025-12-16 10:24:02
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef PMIX_SERVER_OPS_H
0016 #define PMIX_SERVER_OPS_H
0017
0018 #include <unistd.h>
0019 #ifdef HAVE_SYS_TYPES_H
0020 # include <sys/types.h>
0021 #endif
0022
0023 #include "src/include/pmix_config.h"
0024 #include "pmix_common.h"
0025 #include "pmix_server.h"
0026
0027 #include "src/class/pmix_hotel.h"
0028 #include "src/include/pmix_globals.h"
0029 #include "src/include/pmix_types.h"
0030 #include "src/threads/pmix_threads.h"
0031 #include "src/util/pmix_hash.h"
0032
0033 #define PMIX_IOF_HOTEL_SIZE 256
0034 #define PMIX_IOF_MAX_STAY 300000000
0035
0036 typedef struct {
0037 pmix_object_t super;
0038 pmix_event_t ev;
0039 pmix_server_trkr_t *trk;
0040 } pmix_trkr_caddy_t;
0041 PMIX_CLASS_DECLARATION(pmix_trkr_caddy_t);
0042
0043 typedef struct {
0044 pmix_object_t super;
0045 pmix_event_t ev;
0046 pmix_lock_t lock;
0047 pmix_peer_t *peer;
0048 char *nspace;
0049 pmix_status_t status;
0050 pmix_status_t *codes;
0051 size_t ncodes;
0052 pmix_proc_t proc;
0053 pmix_proc_t *procs;
0054 size_t nprocs;
0055 uid_t uid;
0056 gid_t gid;
0057 void *server_object;
0058 int nlocalprocs;
0059 pmix_info_t *info;
0060 size_t ninfo;
0061 bool copied;
0062 char **keys;
0063 pmix_app_t *apps;
0064 size_t napps;
0065 pmix_iof_channel_t channels;
0066 pmix_iof_flags_t flags;
0067 pmix_byte_object_t *bo;
0068 size_t nbo;
0069
0070
0071 time_t ts;
0072
0073 int room;
0074 pmix_op_cbfunc_t opcbfunc;
0075 pmix_dmodex_response_fn_t cbfunc;
0076 pmix_setup_application_cbfunc_t setupcbfunc;
0077 pmix_lookup_cbfunc_t lkcbfunc;
0078 pmix_spawn_cbfunc_t spcbfunc;
0079 void *cbdata;
0080 } pmix_setup_caddy_t;
0081 PMIX_CLASS_DECLARATION(pmix_setup_caddy_t);
0082
0083
0084 typedef void (*pmix_inventory_cbfunc_t)(pmix_status_t status, pmix_list_t *inventory, void *cbdata);
0085
0086
0087 typedef struct {
0088 pmix_object_t super;
0089 pmix_lock_t lock;
0090 pmix_event_t ev;
0091 pmix_status_t status;
0092 int requests;
0093 int replies;
0094 pmix_list_t payload;
0095 pmix_info_t *info;
0096 size_t ninfo;
0097 pmix_inventory_cbfunc_t cbfunc;
0098 pmix_info_cbfunc_t infocbfunc;
0099 pmix_op_cbfunc_t opcbfunc;
0100 void *cbdata;
0101 } pmix_inventory_rollup_t;
0102 PMIX_CLASS_DECLARATION(pmix_inventory_rollup_t);
0103
0104 typedef struct {
0105 pmix_list_item_t super;
0106 pmix_setup_caddy_t *cd;
0107 } pmix_dmdx_remote_t;
0108 PMIX_CLASS_DECLARATION(pmix_dmdx_remote_t);
0109
0110 typedef struct {
0111 pmix_list_item_t super;
0112 pmix_proc_t proc;
0113 pmix_list_t loc_reqs;
0114
0115 pmix_info_t *info;
0116 size_t ninfo;
0117 } pmix_dmdx_local_t;
0118 PMIX_CLASS_DECLARATION(pmix_dmdx_local_t);
0119
0120 typedef struct {
0121 pmix_list_item_t super;
0122 pmix_event_t ev;
0123 bool event_active;
0124 pmix_dmdx_local_t *lcd;
0125 char *key;
0126 pmix_modex_cbfunc_t cbfunc;
0127 void *cbdata;
0128 } pmix_dmdx_request_t;
0129 PMIX_CLASS_DECLARATION(pmix_dmdx_request_t);
0130
0131
0132 typedef struct {
0133 pmix_list_item_t super;
0134 pmix_peer_t *peer;
0135 bool enviro_events;
0136 pmix_proc_t *affected;
0137 size_t naffected;
0138 } pmix_peer_events_info_t;
0139 PMIX_CLASS_DECLARATION(pmix_peer_events_info_t);
0140
0141 typedef struct {
0142 pmix_list_item_t super;
0143 pmix_list_t peers;
0144 int code;
0145 } pmix_regevents_info_t;
0146 PMIX_CLASS_DECLARATION(pmix_regevents_info_t);
0147
0148 typedef struct {
0149 pmix_list_item_t super;
0150 pmix_group_t *grp;
0151 pmix_rank_t rank;
0152 size_t idx;
0153 } pmix_group_caddy_t;
0154 PMIX_CLASS_DECLARATION(pmix_group_caddy_t);
0155
0156 typedef struct {
0157 pmix_list_item_t super;
0158 pmix_proc_t source;
0159 pmix_iof_channel_t channel;
0160 pmix_byte_object_t *bo;
0161 pmix_info_t *info;
0162 size_t ninfo;
0163 } pmix_iof_cache_t;
0164 PMIX_CLASS_DECLARATION(pmix_iof_cache_t);
0165
0166 typedef struct {
0167 pmix_list_item_t super;
0168 char *name;
0169 pmix_proc_t *members;
0170 size_t nmembers;
0171 } pmix_pset_t;
0172 PMIX_CLASS_DECLARATION(pmix_pset_t);
0173
0174 typedef struct {
0175 pmix_list_t nspaces;
0176 pmix_pointer_array_t clients;
0177 pmix_list_t collectives;
0178 pmix_list_t remote_pnd;
0179
0180 pmix_list_t local_reqs;
0181 pmix_list_t gdata;
0182 char **genvars;
0183 pmix_list_t events;
0184 char **failedgrps;
0185 pmix_list_t iof;
0186 pmix_list_t iof_residuals;
0187 pmix_list_t psets;
0188 size_t max_iof_cache;
0189 bool tool_connections_allowed;
0190 char *tmpdir;
0191 char *system_tmpdir;
0192 bool fence_localonly_opt;
0193
0194 int get_output;
0195 int get_verbose;
0196
0197 int connect_output;
0198 int connect_verbose;
0199
0200 int fence_output;
0201 int fence_verbose;
0202
0203 int pub_output;
0204 int pub_verbose;
0205
0206 int spawn_output;
0207 int spawn_verbose;
0208
0209 int event_output;
0210 int event_verbose;
0211
0212 int iof_output;
0213 int iof_verbose;
0214
0215 int base_output;
0216 int base_verbose;
0217
0218 int group_output;
0219 int group_verbose;
0220 } pmix_server_globals_t;
0221
0222 #define PMIX_GDS_CADDY(c, p, t) \
0223 do { \
0224 (c) = PMIX_NEW(pmix_server_caddy_t); \
0225 (c)->hdr.tag = (t); \
0226 PMIX_RETAIN((p)); \
0227 (c)->peer = (p); \
0228 } while (0)
0229
0230 #define PMIX_SETUP_COLLECTIVE(c, t) \
0231 do { \
0232 (c) = PMIX_NEW(pmix_trkr_caddy_t); \
0233 (c)->trk = (t); \
0234 } while (0)
0235
0236 #define PMIX_EXECUTE_COLLECTIVE(c, t, f) \
0237 do { \
0238 PMIX_SETUP_COLLECTIVE(c, t); \
0239 pmix_event_assign(&((c)->ev), pmix_globals.evbase, -1, EV_WRITE, (f), (c)); \
0240 pmix_event_active(&((c)->ev), EV_WRITE, 1); \
0241 } while (0)
0242
0243 PMIX_EXPORT bool pmix_server_trk_update(pmix_server_trkr_t *trk);
0244
0245 PMIX_EXPORT void pmix_pending_nspace_requests(pmix_namespace_t *nptr);
0246 PMIX_EXPORT pmix_status_t pmix_pending_resolve(pmix_namespace_t *nptr, pmix_rank_t rank,
0247 pmix_status_t status, pmix_scope_t scope,
0248 pmix_dmdx_local_t *lcd);
0249
0250 PMIX_EXPORT pmix_status_t pmix_server_abort(pmix_peer_t *peer, pmix_buffer_t *buf,
0251 pmix_op_cbfunc_t cbfunc, void *cbdata);
0252
0253 PMIX_EXPORT pmix_status_t pmix_server_commit(pmix_peer_t *peer, pmix_buffer_t *buf);
0254
0255 PMIX_EXPORT pmix_status_t pmix_server_fence(pmix_server_caddy_t *cd, pmix_buffer_t *buf,
0256 pmix_modex_cbfunc_t modexcbfunc,
0257 pmix_op_cbfunc_t opcbfunc);
0258
0259 PMIX_EXPORT pmix_status_t pmix_server_get(pmix_buffer_t *buf, pmix_modex_cbfunc_t cbfunc,
0260 void *cbdata);
0261
0262 PMIX_EXPORT pmix_status_t pmix_server_publish(pmix_peer_t *peer, pmix_buffer_t *buf,
0263 pmix_op_cbfunc_t cbfunc, void *cbdata);
0264
0265 PMIX_EXPORT pmix_status_t pmix_server_lookup(pmix_peer_t *peer, pmix_buffer_t *buf,
0266 pmix_lookup_cbfunc_t cbfunc, void *cbdata);
0267
0268 PMIX_EXPORT pmix_status_t pmix_server_unpublish(pmix_peer_t *peer, pmix_buffer_t *buf,
0269 pmix_op_cbfunc_t cbfunc, void *cbdata);
0270
0271 PMIX_EXPORT pmix_status_t pmix_server_spawn(pmix_peer_t *peer, pmix_buffer_t *buf,
0272 pmix_spawn_cbfunc_t cbfunc, void *cbdata);
0273 PMIX_EXPORT void pmix_server_spawn_parser(pmix_peer_t *peer,
0274 pmix_iof_channel_t *channels,
0275 pmix_iof_flags_t *flags,
0276 pmix_info_t *info,
0277 size_t ninfo);
0278 PMIX_EXPORT pmix_status_t pmix_server_process_iof(pmix_setup_caddy_t *cd,
0279 char nspace[]);
0280
0281 PMIX_EXPORT void pmix_server_spcbfunc(pmix_status_t status, char nspace[], void *cbdata);
0282
0283 PMIX_EXPORT pmix_status_t pmix_server_connect(pmix_server_caddy_t *cd, pmix_buffer_t *buf,
0284 pmix_op_cbfunc_t cbfunc);
0285
0286 PMIX_EXPORT pmix_status_t pmix_server_disconnect(pmix_server_caddy_t *cd, pmix_buffer_t *buf,
0287 pmix_op_cbfunc_t cbfunc);
0288
0289 PMIX_EXPORT pmix_status_t pmix_server_notify_error(pmix_status_t status, pmix_proc_t procs[],
0290 size_t nprocs, pmix_proc_t error_procs[],
0291 size_t error_nprocs, pmix_info_t info[],
0292 size_t ninfo, pmix_op_cbfunc_t cbfunc,
0293 void *cbdata);
0294
0295 PMIX_EXPORT pmix_status_t pmix_server_register_events(pmix_peer_t *peer, pmix_buffer_t *buf,
0296 pmix_op_cbfunc_t cbfunc, void *cbdata);
0297
0298 PMIX_EXPORT void pmix_server_deregister_events(pmix_peer_t *peer, pmix_buffer_t *buf);
0299
0300 PMIX_EXPORT pmix_status_t pmix_server_query(pmix_peer_t *peer, pmix_buffer_t *buf,
0301 pmix_info_cbfunc_t cbfunc, void *cbdata);
0302
0303 PMIX_EXPORT pmix_status_t pmix_server_log(pmix_peer_t *peer, pmix_buffer_t *buf,
0304 pmix_op_cbfunc_t cbfunc, void *cbdata);
0305
0306 PMIX_EXPORT pmix_status_t pmix_server_alloc(pmix_peer_t *peer, pmix_buffer_t *buf,
0307 pmix_info_cbfunc_t cbfunc, void *cbdata);
0308
0309 PMIX_EXPORT pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer, pmix_buffer_t *buf,
0310 pmix_info_cbfunc_t cbfunc, void *cbdata);
0311
0312 PMIX_EXPORT pmix_status_t pmix_server_monitor(pmix_peer_t *peer, pmix_buffer_t *buf,
0313 pmix_info_cbfunc_t cbfunc, void *cbdata);
0314
0315 PMIX_EXPORT pmix_status_t pmix_server_get_credential(pmix_peer_t *peer, pmix_buffer_t *buf,
0316 pmix_credential_cbfunc_t cbfunc, void *cbdata);
0317
0318 PMIX_EXPORT pmix_status_t pmix_server_validate_credential(pmix_peer_t *peer, pmix_buffer_t *buf,
0319 pmix_validation_cbfunc_t cbfunc,
0320 void *cbdata);
0321
0322 PMIX_EXPORT pmix_status_t pmix_server_iofreg(pmix_peer_t *peer, pmix_buffer_t *buf,
0323 pmix_op_cbfunc_t cbfunc, void *cbdata);
0324
0325 PMIX_EXPORT pmix_status_t pmix_server_iofstdin(pmix_peer_t *peer, pmix_buffer_t *buf,
0326 pmix_op_cbfunc_t cbfunc, void *cbdata);
0327
0328 PMIX_EXPORT pmix_status_t pmix_server_iofdereg(pmix_peer_t *peer, pmix_buffer_t *buf,
0329 pmix_op_cbfunc_t cbfunc, void *cbdata);
0330
0331 PMIX_EXPORT pmix_status_t pmix_server_grpconstruct(pmix_server_caddy_t *cd, pmix_buffer_t *buf);
0332
0333 PMIX_EXPORT pmix_status_t pmix_server_grpdestruct(pmix_server_caddy_t *cd, pmix_buffer_t *buf);
0334
0335 PMIX_EXPORT pmix_status_t pmix_server_event_recvd_from_client(pmix_peer_t *peer, pmix_buffer_t *buf,
0336 pmix_op_cbfunc_t cbfunc,
0337 void *cbdata);
0338 PMIX_EXPORT void pmix_server_execute_collective(int sd, short args, void *cbdata);
0339
0340 PMIX_EXPORT pmix_status_t pmix_server_initialize(void);
0341
0342 PMIX_EXPORT void pmix_server_message_handler(struct pmix_peer_t *pr, pmix_ptl_hdr_t *hdr,
0343 pmix_buffer_t *buf, void *cbdata);
0344
0345 PMIX_EXPORT void pmix_server_purge_events(pmix_peer_t *peer, pmix_proc_t *proc);
0346
0347 PMIX_EXPORT pmix_status_t pmix_server_fabric_register(pmix_server_caddy_t *cd, pmix_buffer_t *buf,
0348 pmix_info_cbfunc_t cbfunc);
0349
0350 PMIX_EXPORT pmix_status_t pmix_server_fabric_update(pmix_server_caddy_t *cd, pmix_buffer_t *buf,
0351 pmix_info_cbfunc_t cbfunc);
0352
0353 PMIX_EXPORT pmix_status_t pmix_server_fabric_get_vertex_info(pmix_server_caddy_t *cd,
0354 pmix_buffer_t *buf,
0355 pmix_info_cbfunc_t cbfunc);
0356
0357 PMIX_EXPORT pmix_status_t pmix_server_fabric_get_device_index(pmix_server_caddy_t *cd,
0358 pmix_buffer_t *buf,
0359 pmix_info_cbfunc_t cbfunc);
0360
0361 PMIX_EXPORT pmix_status_t pmix_server_device_dists(pmix_server_caddy_t *cd,
0362 pmix_buffer_t *buf,
0363 pmix_device_dist_cbfunc_t cbfunc);
0364
0365 PMIX_EXPORT pmix_status_t pmix_server_refresh_cache(pmix_server_caddy_t *cd,
0366 pmix_buffer_t *buf,
0367 pmix_op_cbfunc_t cbfunc);
0368
0369 PMIX_EXPORT void pmix_server_query_cbfunc(pmix_status_t status,
0370 pmix_info_t *info, size_t ninfo, void *cbdata,
0371 pmix_release_cbfunc_t release_fn, void *release_cbdata);
0372
0373 PMIX_EXPORT extern pmix_server_module_t pmix_host_server;
0374 PMIX_EXPORT extern pmix_server_globals_t pmix_server_globals;
0375
0376 static inline pmix_peer_t* pmix_get_peer_object(const pmix_proc_t *proc)
0377 {
0378 pmix_peer_t *peer;
0379 int n;
0380
0381 for (n=0; n < pmix_server_globals.clients.size; n++) {
0382 peer = (pmix_peer_t *) pmix_pointer_array_get_item(&pmix_server_globals.clients, n);
0383 if (NULL == peer) {
0384 continue;
0385 }
0386 if (PMIX_CHECK_NSPACE(proc->nspace, peer->info->pname.nspace) &&
0387 proc->rank == peer->info->pname.rank) {
0388 return peer;
0389 }
0390 }
0391 return NULL;
0392 }
0393
0394
0395 #endif