diff --git a/src/mca/ns/base/ns_base_remote_fns.c b/src/mca/ns/base/ns_base_remote_fns.c index 57ec8b85a3..4098ddd235 100644 --- a/src/mca/ns/base/ns_base_remote_fns.c +++ b/src/mca/ns/base/ns_base_remote_fns.c @@ -23,7 +23,7 @@ mca_ns_base_cellid_t ns_base_create_cellid(void) { ompi_buffer_t cmd; mca_ns_base_cellid_t cell; - ompi_buffer_t *answer; + ompi_buffer_t answer; mca_ns_cmd_flag_t command; int recv_tag; @@ -42,21 +42,21 @@ mca_ns_base_cellid_t ns_base_create_cellid(void) return MCA_NS_BASE_CELLID_MAX; } - if (0 > mca_oob_recv_packed(mca_ns_my_replica, answer, &recv_tag)) { + if (0 > mca_oob_recv_packed(mca_ns_my_replica, &answer, &recv_tag)) { return MCA_NS_BASE_CELLID_MAX; } - if ((OMPI_SUCCESS != ompi_unpack(*answer, &command, 1, MCA_NS_OOB_PACK_CMD)) + if ((OMPI_SUCCESS != ompi_unpack(answer, &command, 1, MCA_NS_OOB_PACK_CMD)) || (MCA_NS_CREATE_CELLID_CMD != command)) { - ompi_buffer_free(*answer); + ompi_buffer_free(answer); return MCA_NS_BASE_CELLID_MAX; } - if (OMPI_SUCCESS != ompi_unpack(*answer, &cell, 1, MCA_NS_OOB_PACK_CELLID)) { - ompi_buffer_free(*answer); + if (OMPI_SUCCESS != ompi_unpack(answer, &cell, 1, MCA_NS_OOB_PACK_CELLID)) { + ompi_buffer_free(answer); return MCA_NS_BASE_CELLID_MAX; } else { - ompi_buffer_free(*answer); + ompi_buffer_free(answer); return cell; } } @@ -66,7 +66,7 @@ mca_ns_base_jobid_t ns_base_create_jobid(void) { ompi_buffer_t cmd; mca_ns_base_jobid_t job; - ompi_buffer_t *answer; + ompi_buffer_t answer; mca_ns_cmd_flag_t command; int recv_tag; @@ -85,21 +85,21 @@ mca_ns_base_jobid_t ns_base_create_jobid(void) return MCA_NS_BASE_JOBID_MAX; } - if (0 > mca_oob_recv_packed(mca_ns_my_replica, answer, &recv_tag)) { + if (0 > mca_oob_recv_packed(mca_ns_my_replica, &answer, &recv_tag)) { return MCA_NS_BASE_JOBID_MAX; } - if ((OMPI_SUCCESS != ompi_unpack(*answer, &command, 1, MCA_NS_OOB_PACK_CMD)) + if ((OMPI_SUCCESS != ompi_unpack(answer, &command, 1, MCA_NS_OOB_PACK_CMD)) || (MCA_NS_CREATE_JOBID_CMD != command)) { - ompi_buffer_free(*answer); + ompi_buffer_free(answer); return MCA_NS_BASE_JOBID_MAX; } - if (OMPI_SUCCESS != ompi_unpack(*answer, &job, 1, MCA_NS_OOB_PACK_JOBID)) { - ompi_buffer_free(*answer); + if (OMPI_SUCCESS != ompi_unpack(answer, &job, 1, MCA_NS_OOB_PACK_JOBID)) { + ompi_buffer_free(answer); return MCA_NS_BASE_JOBID_MAX; } else { - ompi_buffer_free(*answer); + ompi_buffer_free(answer); return job; } } @@ -109,7 +109,7 @@ mca_ns_base_vpid_t ns_base_reserve_range(mca_ns_base_jobid_t job, mca_ns_base_vp { ompi_buffer_t cmd; mca_ns_base_vpid_t starting_vpid; - ompi_buffer_t *answer; + ompi_buffer_t answer; mca_ns_cmd_flag_t command; int recv_tag; @@ -136,21 +136,21 @@ mca_ns_base_vpid_t ns_base_reserve_range(mca_ns_base_jobid_t job, mca_ns_base_vp return MCA_NS_BASE_VPID_MAX; } - if (0 > mca_oob_recv_packed(mca_ns_my_replica, answer, &recv_tag)) { + if (0 > mca_oob_recv_packed(mca_ns_my_replica, &answer, &recv_tag)) { return MCA_NS_BASE_VPID_MAX; } - if ((OMPI_SUCCESS != ompi_unpack(*answer, &command, 1, MCA_NS_OOB_PACK_CMD)) + if ((OMPI_SUCCESS != ompi_unpack(answer, &command, 1, MCA_NS_OOB_PACK_CMD)) || (MCA_NS_RESERVE_RANGE_CMD != command)) { - ompi_buffer_free(*answer); + ompi_buffer_free(answer); return MCA_NS_BASE_VPID_MAX; } - if (OMPI_SUCCESS != ompi_unpack(*answer, &starting_vpid, 1, MCA_NS_OOB_PACK_VPID)) { - ompi_buffer_free(*answer); + if (OMPI_SUCCESS != ompi_unpack(answer, &starting_vpid, 1, MCA_NS_OOB_PACK_VPID)) { + ompi_buffer_free(answer); return MCA_NS_BASE_VPID_MAX; } else { - ompi_buffer_free(*answer); + ompi_buffer_free(answer); return starting_vpid; } } diff --git a/src/mca/ns/ns.h b/src/mca/ns/ns.h index f474136520..a640c5b765 100644 --- a/src/mca/ns/ns.h +++ b/src/mca/ns/ns.h @@ -434,6 +434,13 @@ typedef mca_ns_base_cellid_t (*mca_ns_base_module_get_cellid_fn_t)(const ompi_pr */ typedef int (*mca_ns_base_module_compare_fn_t)(ompi_ns_cmp_bitmask_t fields, const ompi_process_name_t *name1, const ompi_process_name_t *name2); +/** + * Called after all RTE components have been initialized. Provides the selected + * module the chance to perform additional initialization (e.g. register w/ OOB). + */ + +typedef int (*mca_ns_base_module_init_fn_t)(void); + /* * Ver 1.0.0 */ @@ -453,7 +460,9 @@ struct mca_ns_base_module_1_0_0_t { mca_ns_base_module_get_jobid_fn_t get_jobid; mca_ns_base_module_get_cellid_fn_t get_cellid; mca_ns_base_module_compare_fn_t compare; + mca_ns_base_module_init_fn_t init; }; + typedef struct mca_ns_base_module_1_0_0_t mca_ns_base_module_1_0_0_t; typedef mca_ns_base_module_1_0_0_t mca_ns_base_module_t; diff --git a/src/mca/ns/proxy/src/ns_proxy_component.c b/src/mca/ns/proxy/src/ns_proxy_component.c index 99b98f9184..9f1e5a5eb1 100644 --- a/src/mca/ns/proxy/src/ns_proxy_component.c +++ b/src/mca/ns/proxy/src/ns_proxy_component.c @@ -25,6 +25,10 @@ #include "mca/ns/base/base.h" #include "ns_proxy.h" +/* empty stub for proxy */ +static int ns_proxy_init(void) +{ return OMPI_SUCCESS; } + /* * Struct of function pointers that need to be initialized @@ -65,7 +69,8 @@ static mca_ns_base_module_t mca_ns_proxy = { ns_base_get_vpid, ns_base_get_jobid, ns_base_get_cellid, - ns_base_compare + ns_base_compare, + ns_proxy_init }; /* diff --git a/src/mca/ns/replica/src/ns_replica.h b/src/mca/ns/replica/src/ns_replica.h index 26249d9b7d..30209536de 100644 --- a/src/mca/ns/replica/src/ns_replica.h +++ b/src/mca/ns/replica/src/ns_replica.h @@ -51,9 +51,7 @@ int mca_ns_replica_finalize(void); * oob interface */ -void mca_ns_replica_recv(int status, ompi_process_name_t* sender, - ompi_buffer_t* buffer, int* tag, - void* cbdata); +void mca_ns_replica_recv(int status, ompi_process_name_t* sender, ompi_buffer_t buffer, int tag, void* cbdata); /* * Implementation of create_cellid(). diff --git a/src/mca/ns/replica/src/ns_replica_component.c b/src/mca/ns/replica/src/ns_replica_component.c index 100b6f87d4..bce9f125e6 100644 --- a/src/mca/ns/replica/src/ns_replica_component.c +++ b/src/mca/ns/replica/src/ns_replica_component.c @@ -25,6 +25,7 @@ #include "mca/ns/base/base.h" #include "ns_replica.h" +static int mca_ns_replica_module_init(void); /* * Struct of function pointers that need to be initialized @@ -65,7 +66,8 @@ static mca_ns_base_module_t mca_ns_replica = { ns_base_get_vpid, ns_base_get_jobid, ns_base_get_cellid, - ns_base_compare + ns_base_compare, + mca_ns_replica_module_init }; /* @@ -178,76 +180,93 @@ int mca_ns_replica_finalize(void) return OMPI_SUCCESS; } + +/* + * handle message from proxies + */ + void mca_ns_replica_recv(int status, ompi_process_name_t* sender, - ompi_buffer_t* buffer, int* tag, + ompi_buffer_t buffer, int tag, void* cbdata) { - ompi_buffer_t *answer, *error_answer; + ompi_buffer_t answer, error_answer; mca_ns_cmd_flag_t command; mca_ns_base_cellid_t cell; mca_ns_base_jobid_t job; mca_ns_base_vpid_t vpid, range; - if (OMPI_SUCCESS != ompi_unpack(*buffer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { + if (OMPI_SUCCESS != ompi_unpack(buffer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { goto RETURN_ERROR; } - if (OMPI_SUCCESS != ompi_buffer_init(answer, 0)) { + if (OMPI_SUCCESS != ompi_buffer_init(&answer, 0)) { /* RHC -- not sure what to do if this fails */ } if (MCA_NS_CREATE_CELLID_CMD == command) { /* got a command to create a cellid */ - if (OMPI_SUCCESS != ompi_pack(*answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { + if (OMPI_SUCCESS != ompi_pack(answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { goto RETURN_ERROR; } cell = ompi_name_server.create_cellid(); - if (OMPI_SUCCESS != ompi_pack(*answer, (void*)&cell, 1, MCA_NS_OOB_PACK_CELLID)) { + if (OMPI_SUCCESS != ompi_pack(answer, (void*)&cell, 1, MCA_NS_OOB_PACK_CELLID)) { goto RETURN_ERROR; } - if (0 > mca_oob_send_packed(sender, *answer, *tag, 0)) { + if (0 > mca_oob_send_packed(sender, answer, tag, 0)) { /* RHC -- not sure what to do if the return send fails */ } } else if (MCA_NS_CREATE_JOBID_CMD == command) { /* got command to create jobid */ - if (OMPI_SUCCESS != ompi_pack(*answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { + if (OMPI_SUCCESS != ompi_pack(answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { goto RETURN_ERROR; } job = ompi_name_server.create_jobid(); - if (OMPI_SUCCESS != ompi_pack(*answer, (void*)&job, 1, MCA_NS_OOB_PACK_JOBID)) { + if (OMPI_SUCCESS != ompi_pack(answer, (void*)&job, 1, MCA_NS_OOB_PACK_JOBID)) { goto RETURN_ERROR; } - if (0 > mca_oob_send_packed(sender, *answer, *tag, 0)) { + if (0 > mca_oob_send_packed(sender, answer, tag, 0)) { /* RHC -- not sure what to do if the return send fails */ } } else if (MCA_NS_RESERVE_RANGE_CMD == command) { /* got command to reserve vpid range */ - if (OMPI_SUCCESS != ompi_unpack(*buffer, (void*)&job, 1, MCA_NS_OOB_PACK_JOBID)) { + if (OMPI_SUCCESS != ompi_unpack(buffer, (void*)&job, 1, MCA_NS_OOB_PACK_JOBID)) { goto RETURN_ERROR; } - if (OMPI_SUCCESS != ompi_unpack(*buffer, (void*)&range, 1, MCA_NS_OOB_PACK_VPID)) { + if (OMPI_SUCCESS != ompi_unpack(buffer, (void*)&range, 1, MCA_NS_OOB_PACK_VPID)) { goto RETURN_ERROR; } vpid = ompi_name_server.reserve_range(job, range); - if (OMPI_SUCCESS != ompi_pack(*answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { + if (OMPI_SUCCESS != ompi_pack(answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD)) { goto RETURN_ERROR; } - if (OMPI_SUCCESS != ompi_pack(*answer, (void*)&vpid, 1, MCA_NS_OOB_PACK_VPID)) { + if (OMPI_SUCCESS != ompi_pack(answer, (void*)&vpid, 1, MCA_NS_OOB_PACK_VPID)) { goto RETURN_ERROR; } - if (0 > mca_oob_send_packed(sender, *answer, *tag, 0)) { + if (0 > mca_oob_send_packed(sender, answer, tag, 0)) { /* RHC -- not sure what to do if the return send fails */ } + ompi_buffer_free(answer); } else { /* got an unrecognized command */ RETURN_ERROR: - ompi_buffer_free(*buffer); - ompi_buffer_init(error_answer, 0); + ompi_buffer_init(&error_answer, 8); command = MCA_NS_ERROR; - ompi_pack(*error_answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD); - mca_oob_send_packed(sender, *error_answer, *tag, 0); + ompi_pack(error_answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD); + mca_oob_send_packed(sender, error_answer, tag, 0); + ompi_buffer_free(error_answer); } - ompi_buffer_free(*buffer); - /* reissue the non-blocking receive */ + mca_oob_recv_packed_nb(MCA_OOB_NAME_ANY, MCA_OOB_TAG_NS, 0, mca_ns_replica_recv, NULL); } + + +/* + * init the selected module - this is called after all RTE components + * have been initialized + */ + +static int mca_ns_replica_module_init(void) +{ + return mca_oob_recv_packed_nb(MCA_OOB_NAME_ANY, MCA_OOB_TAG_NS, 0, mca_ns_replica_recv, NULL); +} +