1
1

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
Этот коммит содержится в:
Iain Bason 2009-04-01 19:31:46 +00:00
родитель fc8993ba87
Коммит 0a24eadaad
3 изменённых файлов: 12 добавлений и 8 удалений

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

@ -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);