1
1
This commit was SVN r2202.
Этот коммит содержится в:
Tim Woodall 2004-08-18 15:50:10 +00:00
родитель 775a83f039
Коммит 1ebcca8443
5 изменённых файлов: 78 добавлений и 47 удалений

Просмотреть файл

@ -23,7 +23,7 @@ mca_ns_base_cellid_t ns_base_create_cellid(void)
{ {
ompi_buffer_t cmd; ompi_buffer_t cmd;
mca_ns_base_cellid_t cell; mca_ns_base_cellid_t cell;
ompi_buffer_t *answer; ompi_buffer_t answer;
mca_ns_cmd_flag_t command; mca_ns_cmd_flag_t command;
int recv_tag; int recv_tag;
@ -42,21 +42,21 @@ mca_ns_base_cellid_t ns_base_create_cellid(void)
return MCA_NS_BASE_CELLID_MAX; 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; 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)) { || (MCA_NS_CREATE_CELLID_CMD != command)) {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return MCA_NS_BASE_CELLID_MAX; return MCA_NS_BASE_CELLID_MAX;
} }
if (OMPI_SUCCESS != ompi_unpack(*answer, &cell, 1, MCA_NS_OOB_PACK_CELLID)) { if (OMPI_SUCCESS != ompi_unpack(answer, &cell, 1, MCA_NS_OOB_PACK_CELLID)) {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return MCA_NS_BASE_CELLID_MAX; return MCA_NS_BASE_CELLID_MAX;
} else { } else {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return cell; return cell;
} }
} }
@ -66,7 +66,7 @@ mca_ns_base_jobid_t ns_base_create_jobid(void)
{ {
ompi_buffer_t cmd; ompi_buffer_t cmd;
mca_ns_base_jobid_t job; mca_ns_base_jobid_t job;
ompi_buffer_t *answer; ompi_buffer_t answer;
mca_ns_cmd_flag_t command; mca_ns_cmd_flag_t command;
int recv_tag; int recv_tag;
@ -85,21 +85,21 @@ mca_ns_base_jobid_t ns_base_create_jobid(void)
return MCA_NS_BASE_JOBID_MAX; 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; 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)) { || (MCA_NS_CREATE_JOBID_CMD != command)) {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return MCA_NS_BASE_JOBID_MAX; return MCA_NS_BASE_JOBID_MAX;
} }
if (OMPI_SUCCESS != ompi_unpack(*answer, &job, 1, MCA_NS_OOB_PACK_JOBID)) { if (OMPI_SUCCESS != ompi_unpack(answer, &job, 1, MCA_NS_OOB_PACK_JOBID)) {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return MCA_NS_BASE_JOBID_MAX; return MCA_NS_BASE_JOBID_MAX;
} else { } else {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return job; 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; ompi_buffer_t cmd;
mca_ns_base_vpid_t starting_vpid; mca_ns_base_vpid_t starting_vpid;
ompi_buffer_t *answer; ompi_buffer_t answer;
mca_ns_cmd_flag_t command; mca_ns_cmd_flag_t command;
int recv_tag; 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; 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; 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)) { || (MCA_NS_RESERVE_RANGE_CMD != command)) {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return MCA_NS_BASE_VPID_MAX; return MCA_NS_BASE_VPID_MAX;
} }
if (OMPI_SUCCESS != ompi_unpack(*answer, &starting_vpid, 1, MCA_NS_OOB_PACK_VPID)) { if (OMPI_SUCCESS != ompi_unpack(answer, &starting_vpid, 1, MCA_NS_OOB_PACK_VPID)) {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return MCA_NS_BASE_VPID_MAX; return MCA_NS_BASE_VPID_MAX;
} else { } else {
ompi_buffer_free(*answer); ompi_buffer_free(answer);
return starting_vpid; return starting_vpid;
} }
} }

Просмотреть файл

@ -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); 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 * 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_jobid_fn_t get_jobid;
mca_ns_base_module_get_cellid_fn_t get_cellid; mca_ns_base_module_get_cellid_fn_t get_cellid;
mca_ns_base_module_compare_fn_t compare; 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 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; typedef mca_ns_base_module_1_0_0_t mca_ns_base_module_t;

Просмотреть файл

@ -25,6 +25,10 @@
#include "mca/ns/base/base.h" #include "mca/ns/base/base.h"
#include "ns_proxy.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 * 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_vpid,
ns_base_get_jobid, ns_base_get_jobid,
ns_base_get_cellid, ns_base_get_cellid,
ns_base_compare ns_base_compare,
ns_proxy_init
}; };
/* /*

Просмотреть файл

@ -51,9 +51,7 @@ int mca_ns_replica_finalize(void);
* oob interface * oob interface
*/ */
void mca_ns_replica_recv(int status, ompi_process_name_t* sender, void mca_ns_replica_recv(int status, ompi_process_name_t* sender, ompi_buffer_t buffer, int tag, void* cbdata);
ompi_buffer_t* buffer, int* tag,
void* cbdata);
/* /*
* Implementation of create_cellid(). * Implementation of create_cellid().

Просмотреть файл

@ -25,6 +25,7 @@
#include "mca/ns/base/base.h" #include "mca/ns/base/base.h"
#include "ns_replica.h" #include "ns_replica.h"
static int mca_ns_replica_module_init(void);
/* /*
* Struct of function pointers that need to be initialized * 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_vpid,
ns_base_get_jobid, ns_base_get_jobid,
ns_base_get_cellid, 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; return OMPI_SUCCESS;
} }
/*
* handle message from proxies
*/
void mca_ns_replica_recv(int status, ompi_process_name_t* sender, 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) void* cbdata)
{ {
ompi_buffer_t *answer, *error_answer; ompi_buffer_t answer, error_answer;
mca_ns_cmd_flag_t command; mca_ns_cmd_flag_t command;
mca_ns_base_cellid_t cell; mca_ns_base_cellid_t cell;
mca_ns_base_jobid_t job; mca_ns_base_jobid_t job;
mca_ns_base_vpid_t vpid, range; 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; 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 */ /* RHC -- not sure what to do if this fails */
} }
if (MCA_NS_CREATE_CELLID_CMD == command) { /* got a command to create a cellid */ 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; goto RETURN_ERROR;
} }
cell = ompi_name_server.create_cellid(); 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; 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 */ /* RHC -- not sure what to do if the return send fails */
} }
} else if (MCA_NS_CREATE_JOBID_CMD == command) { /* got command to create jobid */ } 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; goto RETURN_ERROR;
} }
job = ompi_name_server.create_jobid(); 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; 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 */ /* 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 */ } 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; 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; goto RETURN_ERROR;
} }
vpid = ompi_name_server.reserve_range(job, range); 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; 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; 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 */ /* RHC -- not sure what to do if the return send fails */
} }
ompi_buffer_free(answer);
} else { /* got an unrecognized command */ } else { /* got an unrecognized command */
RETURN_ERROR: RETURN_ERROR:
ompi_buffer_free(*buffer); ompi_buffer_init(&error_answer, 8);
ompi_buffer_init(error_answer, 0);
command = MCA_NS_ERROR; command = MCA_NS_ERROR;
ompi_pack(*error_answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD); ompi_pack(error_answer, (void*)&command, 1, MCA_NS_OOB_PACK_CMD);
mca_oob_send_packed(sender, *error_answer, *tag, 0); mca_oob_send_packed(sender, error_answer, tag, 0);
ompi_buffer_free(error_answer);
} }
ompi_buffer_free(*buffer);
/* reissue the non-blocking receive */ /* 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);
}