fix a correctness issue by returning an error if waitall fails and invoking the mpi error handler
cmr:v1.7.2:reviewer=jsquyres This commit was SVN r28533.
Этот коммит содержится в:
родитель
128cc27417
Коммит
3e6e1046a3
@ -52,13 +52,13 @@ OMPI_DECLSPEC char* ompi_dpm_base_dyn_init (void);
|
|||||||
OMPI_DECLSPEC int ompi_dpm_base_dyn_finalize (void);
|
OMPI_DECLSPEC int ompi_dpm_base_dyn_finalize (void);
|
||||||
OMPI_DECLSPEC void ompi_dpm_base_mark_dyncomm (ompi_communicator_t *comm);
|
OMPI_DECLSPEC void ompi_dpm_base_mark_dyncomm (ompi_communicator_t *comm);
|
||||||
OMPI_DECLSPEC ompi_dpm_base_disconnect_obj *ompi_dpm_base_disconnect_init ( ompi_communicator_t *comm);
|
OMPI_DECLSPEC ompi_dpm_base_disconnect_obj *ompi_dpm_base_disconnect_init ( ompi_communicator_t *comm);
|
||||||
OMPI_DECLSPEC void ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj **objs);
|
OMPI_DECLSPEC int ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj **objs);
|
||||||
|
|
||||||
/* NULL component functions */
|
/* NULL component functions */
|
||||||
int ompi_dpm_base_null_connect_accept (ompi_communicator_t *comm, int root,
|
int ompi_dpm_base_null_connect_accept (ompi_communicator_t *comm, int root,
|
||||||
char *port_string, bool send_first,
|
char *port_string, bool send_first,
|
||||||
ompi_communicator_t **newcomm);
|
ompi_communicator_t **newcomm);
|
||||||
void ompi_dpm_base_null_disconnect(ompi_communicator_t *comm);
|
int ompi_dpm_base_null_disconnect(ompi_communicator_t *comm);
|
||||||
int ompi_dpm_base_null_spawn(int count, char **array_of_commands,
|
int ompi_dpm_base_null_spawn(int count, char **array_of_commands,
|
||||||
char ***array_of_argv,
|
char ***array_of_argv,
|
||||||
int *array_of_maxprocs,
|
int *array_of_maxprocs,
|
||||||
|
@ -177,7 +177,7 @@ ompi_dpm_base_disconnect_obj *ompi_dpm_base_disconnect_init ( ompi_communicator_
|
|||||||
* - call waitall on the overall request array
|
* - call waitall on the overall request array
|
||||||
* - free the objects
|
* - free the objects
|
||||||
*/
|
*/
|
||||||
void ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj **objs)
|
int ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj **objs)
|
||||||
{
|
{
|
||||||
|
|
||||||
ompi_request_t **reqs=NULL;
|
ompi_request_t **reqs=NULL;
|
||||||
@ -189,7 +189,7 @@ void ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj *
|
|||||||
for (i=0; i<count; i++) {
|
for (i=0; i<count; i++) {
|
||||||
if (NULL == objs[i]) {
|
if (NULL == objs[i]) {
|
||||||
printf("Error in comm_disconnect_waitall\n");
|
printf("Error in comm_disconnect_waitall\n");
|
||||||
return;
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
totalcount += objs[i]->size;
|
totalcount += objs[i]->size;
|
||||||
@ -198,7 +198,7 @@ void ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj *
|
|||||||
reqs = (ompi_request_t **) malloc (2*totalcount*sizeof(ompi_request_t *));
|
reqs = (ompi_request_t **) malloc (2*totalcount*sizeof(ompi_request_t *));
|
||||||
if ( NULL == reqs ) {
|
if ( NULL == reqs ) {
|
||||||
printf("ompi_comm_disconnect_waitall: error allocating memory\n");
|
printf("ompi_comm_disconnect_waitall: error allocating memory\n");
|
||||||
return;
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate a single, large array of pending requests */
|
/* generate a single, large array of pending requests */
|
||||||
@ -221,7 +221,7 @@ void ompi_dpm_base_disconnect_waitall (int count, ompi_dpm_base_disconnect_obj *
|
|||||||
|
|
||||||
free (reqs);
|
free (reqs);
|
||||||
|
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
@ -37,9 +37,9 @@ int ompi_dpm_base_null_connect_accept (ompi_communicator_t *comm, int root,
|
|||||||
return OMPI_ERR_NOT_SUPPORTED;
|
return OMPI_ERR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ompi_dpm_base_null_disconnect(ompi_communicator_t *comm)
|
int ompi_dpm_base_null_disconnect(ompi_communicator_t *comm)
|
||||||
{
|
{
|
||||||
return;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ompi_dpm_base_null_spawn(int count, char **array_of_commands,
|
int ompi_dpm_base_null_spawn(int count, char **array_of_commands,
|
||||||
|
@ -51,7 +51,7 @@ typedef int (*ompi_dpm_base_module_connect_accept_fn_t)(ompi_communicator_t *com
|
|||||||
* Executes internally a disconnect on all dynamic communicators
|
* Executes internally a disconnect on all dynamic communicators
|
||||||
* in case the user did not disconnect them.
|
* in case the user did not disconnect them.
|
||||||
*/
|
*/
|
||||||
typedef void (*ompi_dpm_base_module_disconnect_fn_t)(ompi_communicator_t *comm);
|
typedef int (*ompi_dpm_base_module_disconnect_fn_t)(ompi_communicator_t *comm);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dynamically spawn processes
|
* Dynamically spawn processes
|
||||||
|
@ -72,7 +72,7 @@ static int init(void);
|
|||||||
static int connect_accept ( ompi_communicator_t *comm, int root,
|
static int connect_accept ( ompi_communicator_t *comm, int root,
|
||||||
char *port_string, bool send_first,
|
char *port_string, bool send_first,
|
||||||
ompi_communicator_t **newcomm );
|
ompi_communicator_t **newcomm );
|
||||||
static void disconnect(ompi_communicator_t *comm);
|
static int disconnect(ompi_communicator_t *comm);
|
||||||
static int spawn(int count, char **array_of_commands,
|
static int spawn(int count, char **array_of_commands,
|
||||||
char ***array_of_argv,
|
char ***array_of_argv,
|
||||||
int *array_of_maxprocs,
|
int *array_of_maxprocs,
|
||||||
@ -646,12 +646,12 @@ static int connect_accept ( ompi_communicator_t *comm, int root,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disconnect(ompi_communicator_t *comm)
|
static int disconnect(ompi_communicator_t *comm)
|
||||||
{
|
{
|
||||||
ompi_dpm_base_disconnect_obj *dobj;
|
ompi_dpm_base_disconnect_obj *dobj;
|
||||||
|
|
||||||
dobj = ompi_dpm_base_disconnect_init (comm);
|
dobj = ompi_dpm_base_disconnect_init (comm);
|
||||||
ompi_dpm_base_disconnect_waitall(1, &dobj);
|
return ompi_dpm_base_disconnect_waitall(1, &dobj);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,8 @@ static const char FUNC_NAME[] = "MPI_Comm_disconnect";
|
|||||||
|
|
||||||
int MPI_Comm_disconnect(MPI_Comm *comm)
|
int MPI_Comm_disconnect(MPI_Comm *comm)
|
||||||
{
|
{
|
||||||
|
int ret = MPI_SUCCESS;
|
||||||
|
|
||||||
MEMCHECKER(
|
MEMCHECKER(
|
||||||
memchecker_comm(*comm);
|
memchecker_comm(*comm);
|
||||||
);
|
);
|
||||||
@ -60,7 +62,9 @@ int MPI_Comm_disconnect(MPI_Comm *comm)
|
|||||||
OPAL_CR_ENTER_LIBRARY();
|
OPAL_CR_ENTER_LIBRARY();
|
||||||
|
|
||||||
if ( OMPI_COMM_IS_DYNAMIC(*comm)) {
|
if ( OMPI_COMM_IS_DYNAMIC(*comm)) {
|
||||||
ompi_dpm.disconnect (*comm);
|
if (OMPI_SUCCESS != ompi_dpm.disconnect (*comm)) {
|
||||||
|
ret = OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, FUNC_NAME);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
(*comm)->c_coll.coll_barrier(*comm, (*comm)->c_coll.coll_barrier_module);
|
(*comm)->c_coll.coll_barrier(*comm, (*comm)->c_coll.coll_barrier_module);
|
||||||
@ -69,5 +73,5 @@ int MPI_Comm_disconnect(MPI_Comm *comm)
|
|||||||
ompi_comm_free(comm);
|
ompi_comm_free(comm);
|
||||||
|
|
||||||
OPAL_CR_EXIT_LIBRARY();
|
OPAL_CR_EXIT_LIBRARY();
|
||||||
return MPI_SUCCESS;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user