Merge pull request #8342 from AboorvaDevarajan/fix_comm_errhandler
ompi/errhandler: fix comm errhandler issue
Этот коммит содержится в:
Коммит
debea778d7
@ -367,8 +367,6 @@ static void ompi_errhandler_construct(ompi_errhandler_t *new_errhandler)
|
|||||||
new_errhandler->eh_file_fn = NULL;
|
new_errhandler->eh_file_fn = NULL;
|
||||||
new_errhandler->eh_fort_fn = NULL;
|
new_errhandler->eh_fort_fn = NULL;
|
||||||
|
|
||||||
new_errhandler->eh_cxx_dispatch_fn = NULL;
|
|
||||||
|
|
||||||
memset (new_errhandler->eh_name, 0, MPI_MAX_OBJECT_NAME);
|
memset (new_errhandler->eh_name, 0, MPI_MAX_OBJECT_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,6 @@ typedef void (ompi_errhandler_generic_handler_fn_t)(void *, int *, ...);
|
|||||||
*/
|
*/
|
||||||
enum ompi_errhandler_lang_t {
|
enum ompi_errhandler_lang_t {
|
||||||
OMPI_ERRHANDLER_LANG_C,
|
OMPI_ERRHANDLER_LANG_C,
|
||||||
OMPI_ERRHANDLER_LANG_CXX,
|
|
||||||
OMPI_ERRHANDLER_LANG_FORTRAN
|
OMPI_ERRHANDLER_LANG_FORTRAN
|
||||||
};
|
};
|
||||||
typedef enum ompi_errhandler_lang_t ompi_errhandler_lang_t;
|
typedef enum ompi_errhandler_lang_t ompi_errhandler_lang_t;
|
||||||
@ -89,17 +88,6 @@ enum ompi_errhandler_type_t {
|
|||||||
typedef enum ompi_errhandler_type_t ompi_errhandler_type_t;
|
typedef enum ompi_errhandler_type_t ompi_errhandler_type_t;
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Need to forward declare this for use in ompi_errhandle_cxx_dispatch_fn_t.
|
|
||||||
*/
|
|
||||||
struct ompi_errhandler_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* C++ invocation function signature
|
|
||||||
*/
|
|
||||||
typedef void (ompi_errhandler_cxx_dispatch_fn_t)(void *handle, int *err_code,
|
|
||||||
const char *message, ompi_errhandler_generic_handler_fn_t *fn);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Back-end type for MPI_Errorhandler.
|
* Back-end type for MPI_Errorhandler.
|
||||||
*/
|
*/
|
||||||
@ -123,14 +111,6 @@ struct ompi_errhandler_t {
|
|||||||
MPI_Win_errhandler_function *eh_win_fn;
|
MPI_Win_errhandler_function *eh_win_fn;
|
||||||
ompi_errhandler_fortran_handler_fn_t *eh_fort_fn;
|
ompi_errhandler_fortran_handler_fn_t *eh_fort_fn;
|
||||||
|
|
||||||
/* Have separate callback for C++ errhandlers. This pointer is
|
|
||||||
initialized to NULL and will be set explicitly by the C++
|
|
||||||
bindings for Create_errhandler. This function is invoked
|
|
||||||
when eh_lang==OMPI_ERRHANDLER_LANG_CXX so that the user's
|
|
||||||
callback function can be invoked with the right language
|
|
||||||
semantics. */
|
|
||||||
ompi_errhandler_cxx_dispatch_fn_t *eh_cxx_dispatch_fn;
|
|
||||||
|
|
||||||
/* index in Fortran <-> C translation array */
|
/* index in Fortran <-> C translation array */
|
||||||
int eh_f_to_c_index;
|
int eh_f_to_c_index;
|
||||||
};
|
};
|
||||||
|
@ -48,7 +48,17 @@ int ompi_errhandler_invoke(ompi_errhandler_t *errhandler, void *mpi_object,
|
|||||||
if (state >= OMPI_MPI_STATE_INIT_COMPLETED &&
|
if (state >= OMPI_MPI_STATE_INIT_COMPLETED &&
|
||||||
state < OMPI_MPI_STATE_FINALIZE_PAST_COMM_SELF_DESTRUCT) {
|
state < OMPI_MPI_STATE_FINALIZE_PAST_COMM_SELF_DESTRUCT) {
|
||||||
comm = (ompi_mpi_compat_mpi3)? &ompi_mpi_comm_world.comm: &ompi_mpi_comm_self.comm;
|
comm = (ompi_mpi_compat_mpi3)? &ompi_mpi_comm_world.comm: &ompi_mpi_comm_self.comm;
|
||||||
comm->error_handler->eh_comm_fn(&comm, &err_code, message, NULL);
|
switch (comm->error_handler->eh_lang) {
|
||||||
|
case OMPI_ERRHANDLER_LANG_C:
|
||||||
|
comm->error_handler->eh_comm_fn(&comm, &err_code, message, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
||||||
|
fortran_handle = OMPI_INT_2_FINT(comm->c_f_to_c_index);
|
||||||
|
comm->error_handler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
||||||
|
err_code = OMPI_FINT_2_INT(fortran_err_code);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(NULL == ompi_initial_error_handler) {
|
if(NULL == ompi_initial_error_handler) {
|
||||||
@ -74,11 +84,6 @@ int ompi_errhandler_invoke(ompi_errhandler_t *errhandler, void *mpi_object,
|
|||||||
errhandler->eh_comm_fn(&comm, &err_code, message, NULL);
|
errhandler->eh_comm_fn(&comm, &err_code, message, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMPI_ERRHANDLER_LANG_CXX:
|
|
||||||
errhandler->eh_cxx_dispatch_fn(&comm, &err_code, message,
|
|
||||||
(ompi_errhandler_generic_handler_fn_t *)errhandler->eh_comm_fn);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
||||||
fortran_handle = OMPI_INT_2_FINT(comm->c_f_to_c_index);
|
fortran_handle = OMPI_INT_2_FINT(comm->c_f_to_c_index);
|
||||||
errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
||||||
@ -94,11 +99,6 @@ int ompi_errhandler_invoke(ompi_errhandler_t *errhandler, void *mpi_object,
|
|||||||
errhandler->eh_win_fn(&win, &err_code, message, NULL);
|
errhandler->eh_win_fn(&win, &err_code, message, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMPI_ERRHANDLER_LANG_CXX:
|
|
||||||
errhandler->eh_cxx_dispatch_fn(&win, &err_code, message,
|
|
||||||
(ompi_errhandler_generic_handler_fn_t *)errhandler->eh_win_fn);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
||||||
fortran_handle = OMPI_INT_2_FINT(win->w_f_to_c_index);
|
fortran_handle = OMPI_INT_2_FINT(win->w_f_to_c_index);
|
||||||
errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
||||||
@ -114,11 +114,6 @@ int ompi_errhandler_invoke(ompi_errhandler_t *errhandler, void *mpi_object,
|
|||||||
errhandler->eh_file_fn(&file, &err_code, message, NULL);
|
errhandler->eh_file_fn(&file, &err_code, message, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMPI_ERRHANDLER_LANG_CXX:
|
|
||||||
errhandler->eh_cxx_dispatch_fn(&file, &err_code, message,
|
|
||||||
(ompi_errhandler_generic_handler_fn_t *)errhandler->eh_file_fn);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
case OMPI_ERRHANDLER_LANG_FORTRAN:
|
||||||
fortran_handle = OMPI_INT_2_FINT(file->f_f_to_c_index);
|
fortran_handle = OMPI_INT_2_FINT(file->f_f_to_c_index);
|
||||||
errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
errhandler->eh_fort_fn(&fortran_handle, &fortran_err_code);
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user