#ifndef PMIX_GDS_H
#define PMIX_GDS_H
#include "src/include/pmix_config.h"
#include "pmix_common.h"
#include "src/mca/base/pmix_mca_base_framework.h"
#include "src/mca/base/pmix_mca_base_var.h"
#include "src/mca/bfrops/bfrops_types.h"
#include "src/mca/mca.h"
BEGIN_C_DECLS
struct pmix_peer_t;
struct pmix_namespace_t;
PMIX_EXPORT extern int pmix_gds_base_output;
typedef pmix_status_t (*pmix_gds_base_module_init_fn_t)(pmix_info_t info[], size_t ninfo);
typedef void (*pmix_gds_base_module_fini_fn_t)(void);
typedef pmix_status_t (*pmix_gds_base_assign_module_fn_t)(pmix_info_t *info, size_t ninfo,
int *priority);
#define PMIX_GDS_CHECK_COMPONENT(p, s) (0 == strcmp((p)->nptr->compat.gds->name, (s)))
#define PMIX_GDS_CHECK_PEER_COMPONENT(p1, p2) \
(0 == strcmp((p1)->nptr->compat.gds->name, (p2)->nptr->compat.gds->name))
typedef pmix_status_t (*pmix_gds_base_module_assemb_kvs_req_fn_t)(const pmix_proc_t *proc,
pmix_list_t *kvs,
pmix_buffer_t *buf, void *cbdata);
#define PMIX_GDS_ASSEMB_KVS_REQ(s, p, r, k, b, c) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
(s) = PMIX_SUCCESS; \
if (NULL == _g->assemb_kvs_req) { \
if (0 == strcmp(_g->name, "hash")) { \
(s) = PMIX_ERR_NOT_SUPPORTED; \
} else { \
_g = pmix_globals.mypeer->nptr->compat.gds; \
} \
} \
if (NULL != _g->assemb_kvs_req) { \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS ASSEMBLE REQ WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->assemb_kvs_req(r, k, b, (void *) c); \
} \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_accept_kvs_resp_fn_t)(pmix_buffer_t *buf);
#define PMIX_GDS_ACCEPT_KVS_RESP(s, p, b) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
(s) = PMIX_SUCCESS; \
if (NULL == _g->accept_kvs_resp) { \
if (0 == strcmp(_g->name, "hash")) { \
(s) = PMIX_ERR_NOT_SUPPORTED; \
} else { \
_g = pmix_globals.mypeer->nptr->compat.gds; \
} \
} \
if (NULL != _g->accept_kvs_resp) { \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS ACCEPT RESP WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->accept_kvs_resp(b); \
} \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_cache_job_info_fn_t)(struct pmix_namespace_t *ns,
pmix_info_t info[], size_t ninfo);
#define PMIX_GDS_CACHE_JOB_INFO(s, p, n, i, ni) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, "[%s:%d] GDS CACHE JOB INFO WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->cache_job_info((struct pmix_namespace_t *) (n), (i), (ni)); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_register_job_info_fn_t)(struct pmix_peer_t *pr,
pmix_buffer_t *reply);
#define PMIX_GDS_REGISTER_JOB_INFO(s, p, b) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, "[%s:%d] GDS REG JOB INFO WITH %s", __FILE__, \
__LINE__, _g->name); \
(s) = _g->register_job_info((struct pmix_peer_t *) (p), b); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_store_job_info_fn_t)(const char *nspace,
pmix_buffer_t *buf);
#define PMIX_GDS_STORE_JOB_INFO(s, p, n, b) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, "[%s:%d] GDS STORE JOB INFO WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->store_job_info(n, b); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_store_fn_t)(const pmix_proc_t *proc,
pmix_scope_t scope, pmix_kval_t *kv);
#define PMIX_GDS_STORE_KV(s, p, pc, sc, k) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
(s) = PMIX_SUCCESS; \
if (NULL == _g->store) { \
if (0 == strcmp(_g->name, "hash")) { \
(s) = PMIX_ERR_NOT_SUPPORTED; \
} else { \
_g = pmix_globals.mypeer->nptr->compat.gds; \
} \
} \
if (NULL != _g->store) { \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS STORE KV WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->store(pc, sc, k); \
} \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_store_modex_fn_t)(struct pmix_namespace_t *ns,
pmix_buffer_t *buff, void *cbdata);
#define PMIX_GDS_STORE_MODEX(r, n, b, t) \
do { \
pmix_gds_base_module_t *_g = pmix_globals.mypeer->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS STORE MODEX WITH %s", __FILE__, \
__LINE__, _g->name); \
(r) = _g->store_modex((struct pmix_namespace_t *)n, b, t); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_mark_modex_complete_fn_t)(struct pmix_peer_t *peer,
pmix_list_t *nslist,
pmix_buffer_t *buff);
#define PMIX_GDS_MARK_MODEX_COMPLETE(r, p, l, b) \
do { \
pmix_gds_base_module_t *_g = pmix_globals.mypeer->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS MARK MODEX COMPLETE WITH %s", \
__FILE__, __LINE__, _g->name); \
(r) = _g->mark_modex_complete(p, l, b); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_recv_modex_complete_fn_t)(pmix_buffer_t *buff);
#define PMIX_GDS_RECV_MODEX_COMPLETE(r, p, b) \
do { \
pmix_gds_base_module_t *_g = pmix_globals.mypeer->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS RECV MODEX COMPLETE WITH %s", \
__FILE__, __LINE__, _g->name); \
(r) = _g->recv_modex_complete(b); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_fetch_fn_t)(struct pmix_peer_t *peer,
const pmix_proc_t *proc,
pmix_scope_t scope, bool copy,
const char *key, pmix_info_t info[],
size_t ninfo, pmix_list_t *kvs);
#define PMIX_GDS_FETCH_KV(s, p, c) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS FETCH KV WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->fetch((p), (c)->proc, (c)->scope, (c)->copy, (c)->key, \
(c)->info, (c)->ninfo, &(c)->kvs); \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_setup_fork_fn_t)(const pmix_proc_t *proc, char ***env);
typedef pmix_status_t (*pmix_gds_base_module_add_nspace_fn_t)(const char *nspace,
uint32_t nlocalprocs,
pmix_info_t info[], size_t ninfo);
#define PMIX_GDS_ADD_NSPACE(s, n, ls, i, ni) \
do { \
pmix_gds_base_active_module_t *_g; \
pmix_status_t _s = PMIX_SUCCESS; \
(s) = PMIX_SUCCESS; \
pmix_output_verbose(1, pmix_gds_base_output, "[%s:%d] GDS ADD NSPACE %s", __FILE__, \
__LINE__, (n)); \
PMIX_LIST_FOREACH (_g, &pmix_gds_globals.actives, pmix_gds_base_active_module_t) { \
if (NULL != _g->module->add_nspace) { \
_s = _g->module->add_nspace(n, ls, i, ni); \
} \
if (PMIX_SUCCESS != _s) { \
(s) = PMIX_ERROR; \
} \
} \
} while (0)
typedef pmix_status_t (*pmix_gds_base_module_del_nspace_fn_t)(const char *nspace);
#define PMIX_GDS_DEL_NSPACE(s, n) \
do { \
pmix_gds_base_active_module_t *_g; \
pmix_status_t _s = PMIX_SUCCESS; \
(s) = PMIX_SUCCESS; \
pmix_output_verbose(1, pmix_gds_base_output, "[%s:%d] GDS DEL NSPACE %s", __FILE__, \
__LINE__, (n)); \
PMIX_LIST_FOREACH (_g, &pmix_gds_globals.actives, pmix_gds_base_active_module_t) { \
if (NULL != _g->module->del_nspace) { \
_s = _g->module->del_nspace(n); \
} \
if (PMIX_SUCCESS != _s) { \
(s) = PMIX_ERROR; \
} \
} \
} while (0)
#define PMIX_GDS_FETCH_IS_TSAFE(s, p) \
do { \
pmix_gds_base_module_t *_g = (p)->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS FETCH IS THREAD SAFE WITH %s", \
__FILE__, __LINE__, _g->name); \
if (true == _g->is_tsafe) { \
(s) = PMIX_SUCCESS; \
} else { \
(s) = PMIX_ERR_NOT_SUPPORTED; \
} \
} while(0)
typedef pmix_status_t (*pmix_gds_base_module_fetch_array_fn_t)(struct pmix_peer_t *pr,
pmix_buffer_t *reply);
#define PMIX_GDS_FETCH_INFO_ARRAYS(s, p, b) \
do { \
pmix_gds_base_module_t *_g = pmix_globals.mypeer->nptr->compat.gds; \
pmix_output_verbose(1, pmix_gds_base_output, \
"[%s:%d] GDS FETCH ARRAYS WITH %s", \
__FILE__, __LINE__, _g->name); \
(s) = _g->fetch_arrays((struct pmix_peer_t*)(p), b); \
} while(0)
typedef struct {
const char *name;
const bool is_tsafe;
pmix_gds_base_module_init_fn_t init;
pmix_gds_base_module_fini_fn_t finalize;
pmix_gds_base_assign_module_fn_t assign_module;
pmix_gds_base_module_cache_job_info_fn_t cache_job_info;
pmix_gds_base_module_register_job_info_fn_t register_job_info;
pmix_gds_base_module_store_job_info_fn_t store_job_info;
pmix_gds_base_module_store_fn_t store;
pmix_gds_base_module_store_modex_fn_t store_modex;
pmix_gds_base_module_fetch_fn_t fetch;
pmix_gds_base_module_setup_fork_fn_t setup_fork;
pmix_gds_base_module_add_nspace_fn_t add_nspace;
pmix_gds_base_module_del_nspace_fn_t del_nspace;
pmix_gds_base_module_assemb_kvs_req_fn_t assemb_kvs_req;
pmix_gds_base_module_accept_kvs_resp_fn_t accept_kvs_resp;
pmix_gds_base_module_fetch_array_fn_t fetch_arrays;
pmix_gds_base_module_mark_modex_complete_fn_t mark_modex_complete;
pmix_gds_base_module_recv_modex_complete_fn_t recv_modex_complete;
} pmix_gds_base_module_t;
typedef pmix_mca_base_component_t pmix_gds_base_component_t;
#define PMIX_GDS_BASE_VERSION_1_0_0 PMIX_MCA_BASE_VERSION_1_0_0("gds", 1, 0, 0)
END_C_DECLS
#endif