Fix Fortran bindings for MPI_KEYVAL_CREATE and MPI_COMM_CREATE_KEYVAL.
The EXTRA_STATE parameter is passed by reference, and thus should be dereferenced before it is stored. Similarly, the stored value should be passed by reference to the copy and delete routines. This fixes trac:1864. This commit was SVN r20926. The following Trac tickets were found above: Ticket 1864 --> https://svn.open-mpi.org/trac/ompi/ticket/1864
Этот коммит содержится в:
родитель
fc8993ba87
Коммит
0a24eadaad
@ -249,9 +249,10 @@
|
|||||||
/* MPI-1 Fortran-style */ \
|
/* MPI-1 Fortran-style */ \
|
||||||
if (0 != (keyval_obj->attr_flag & OMPI_KEYVAL_F77_MPI1)) { \
|
if (0 != (keyval_obj->attr_flag & OMPI_KEYVAL_F77_MPI1)) { \
|
||||||
MPI_Fint attr_val = translate_to_fortran_mpi1(attribute); \
|
MPI_Fint attr_val = translate_to_fortran_mpi1(attribute); \
|
||||||
|
MPI_Fint extra_state = (MPI_Fint)keyval_obj->extra_state; \
|
||||||
(*((keyval_obj->delete_attr_fn).attr_mpi1_fortran_delete_fn)) \
|
(*((keyval_obj->delete_attr_fn).attr_mpi1_fortran_delete_fn)) \
|
||||||
(&(((ompi_##type##_t *)object)->attr_##type##_f), \
|
(&(((ompi_##type##_t *)object)->attr_##type##_f), \
|
||||||
&f_key, &attr_val, (int*)keyval_obj->extra_state, &f_err); \
|
&f_key, &attr_val, &extra_state, &f_err); \
|
||||||
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
||||||
if (need_lock) { \
|
if (need_lock) { \
|
||||||
OPAL_THREAD_UNLOCK(&alock); \
|
OPAL_THREAD_UNLOCK(&alock); \
|
||||||
@ -262,9 +263,10 @@
|
|||||||
/* MPI-2 Fortran-style */ \
|
/* MPI-2 Fortran-style */ \
|
||||||
else { \
|
else { \
|
||||||
MPI_Aint attr_val = translate_to_fortran_mpi2(attribute); \
|
MPI_Aint attr_val = translate_to_fortran_mpi2(attribute); \
|
||||||
|
MPI_Aint extra_state = (MPI_Aint)keyval_obj->extra_state; \
|
||||||
(*((keyval_obj->delete_attr_fn).attr_mpi2_fortran_delete_fn)) \
|
(*((keyval_obj->delete_attr_fn).attr_mpi2_fortran_delete_fn)) \
|
||||||
(&(((ompi_##type##_t *)object)->attr_##type##_f), \
|
(&(((ompi_##type##_t *)object)->attr_##type##_f), \
|
||||||
&f_key, (int*)&attr_val, (int*)keyval_obj->extra_state, &f_err); \
|
&f_key, (int*)&attr_val, &extra_state, &f_err); \
|
||||||
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
||||||
if (need_lock) { \
|
if (need_lock) { \
|
||||||
OPAL_THREAD_UNLOCK(&alock); \
|
OPAL_THREAD_UNLOCK(&alock); \
|
||||||
@ -297,11 +299,12 @@
|
|||||||
ompi_fortran_logical_t f_flag; \
|
ompi_fortran_logical_t f_flag; \
|
||||||
/* MPI-1 Fortran-style */ \
|
/* MPI-1 Fortran-style */ \
|
||||||
if (0 != (keyval_obj->attr_flag & OMPI_KEYVAL_F77_MPI1)) { \
|
if (0 != (keyval_obj->attr_flag & OMPI_KEYVAL_F77_MPI1)) { \
|
||||||
MPI_Fint in, out; \
|
MPI_Fint in, out, extra_state; \
|
||||||
in = translate_to_fortran_mpi1(in_attr); \
|
in = translate_to_fortran_mpi1(in_attr); \
|
||||||
|
extra_state = (MPI_Fint)keyval_obj->extra_state; \
|
||||||
(*((keyval_obj->copy_attr_fn).attr_mpi1_fortran_copy_fn)) \
|
(*((keyval_obj->copy_attr_fn).attr_mpi1_fortran_copy_fn)) \
|
||||||
(&(((ompi_##type##_t *)old_object)->attr_##type##_f), \
|
(&(((ompi_##type##_t *)old_object)->attr_##type##_f), \
|
||||||
&f_key, (int*)keyval_obj->extra_state, \
|
&f_key, &extra_state, \
|
||||||
&in, &out, &f_flag, &f_err); \
|
&in, &out, &f_flag, &f_err); \
|
||||||
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
||||||
OPAL_THREAD_UNLOCK(&alock); \
|
OPAL_THREAD_UNLOCK(&alock); \
|
||||||
@ -313,11 +316,12 @@
|
|||||||
} \
|
} \
|
||||||
/* MPI-2 Fortran-style */ \
|
/* MPI-2 Fortran-style */ \
|
||||||
else { \
|
else { \
|
||||||
MPI_Aint in, out; \
|
MPI_Aint in, out, extra_state; \
|
||||||
in = translate_to_fortran_mpi2(in_attr); \
|
in = translate_to_fortran_mpi2(in_attr); \
|
||||||
|
extra_state = (MPI_Aint)keyval_obj->extra_state; \
|
||||||
(*((keyval_obj->copy_attr_fn).attr_mpi2_fortran_copy_fn)) \
|
(*((keyval_obj->copy_attr_fn).attr_mpi2_fortran_copy_fn)) \
|
||||||
(&(((ompi_##type##_t *)old_object)->attr_##type##_f), \
|
(&(((ompi_##type##_t *)old_object)->attr_##type##_f), \
|
||||||
&f_key, keyval_obj->extra_state, &in, &out, \
|
&f_key, &extra_state, &in, &out, \
|
||||||
&f_flag, &f_err); \
|
&f_flag, &f_err); \
|
||||||
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
if (MPI_SUCCESS != OMPI_FINT_2_INT(f_err)) { \
|
||||||
OPAL_THREAD_UNLOCK(&alock); \
|
OPAL_THREAD_UNLOCK(&alock); \
|
||||||
|
@ -79,7 +79,7 @@ void mpi_comm_create_keyval_f(ompi_mpi2_fortran_copy_attr_function* comm_copy_at
|
|||||||
to the old MPI-1 INTEGER-parameter functions). */
|
to the old MPI-1 INTEGER-parameter functions). */
|
||||||
|
|
||||||
ret = ompi_attr_create_keyval(COMM_ATTR, copy_fn, del_fn,
|
ret = ompi_attr_create_keyval(COMM_ATTR, copy_fn, del_fn,
|
||||||
comm_keyval, extra_state, OMPI_KEYVAL_F77,
|
comm_keyval, (void*)*extra_state, OMPI_KEYVAL_F77,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (MPI_SUCCESS != ret) {
|
if (MPI_SUCCESS != ret) {
|
||||||
|
@ -79,7 +79,7 @@ void mpi_keyval_create_f(ompi_mpi1_fortran_copy_attr_function* copy_attr_fn,
|
|||||||
functions). */
|
functions). */
|
||||||
|
|
||||||
ret = ompi_attr_create_keyval(COMM_ATTR, copy_fn, del_fn,
|
ret = ompi_attr_create_keyval(COMM_ATTR, copy_fn, del_fn,
|
||||||
keyval, extra_state,
|
keyval, (void*)*extra_state,
|
||||||
OMPI_KEYVAL_F77 | OMPI_KEYVAL_F77_MPI1,
|
OMPI_KEYVAL_F77 | OMPI_KEYVAL_F77_MPI1,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user