X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/794555c12839e503e3fd6e101e3e82336036939e..2b4dcee56b147273d7e7c0c8c2b376c0297aa594:/src/smpi/bindings/smpi_f77_type.cpp diff --git a/src/smpi/bindings/smpi_f77_type.cpp b/src/smpi/bindings/smpi_f77_type.cpp index b40ab8060d..f59b92d9bb 100644 --- a/src/smpi/bindings/smpi_f77_type.cpp +++ b/src/smpi/bindings/smpi_f77_type.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2019. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -56,14 +56,17 @@ void mpi_type_get_name_ (int* datatype, char * name, int* len, int* ierr){ name[*len]=' '; } -void mpi_type_get_attr_ (int* type, int* type_keyval, void *attribute_val, int* flag, int* ierr){ - - *ierr = MPI_Type_get_attr ( simgrid::smpi::Datatype::f2c(*type), *type_keyval, attribute_val,flag); +void mpi_type_get_attr_ (int* type, int* type_keyval, int *attribute_val, int* flag, int* ierr){ + int* value = nullptr; + *ierr = MPI_Type_get_attr ( simgrid::smpi::Datatype::f2c(*type), *type_keyval, &value, flag); + if (*flag == 1) + *attribute_val = *value; } -void mpi_type_set_attr_ (int* type, int* type_keyval, void *attribute_val, int* ierr){ - - *ierr = MPI_Type_set_attr ( simgrid::smpi::Datatype::f2c(*type), *type_keyval, attribute_val); +void mpi_type_set_attr_ (int* type, int* type_keyval, int *attribute_val, int* ierr){ + int* val = (int*)xbt_malloc(sizeof(int)); + *val=*attribute_val; + *ierr = MPI_Type_set_attr ( simgrid::smpi::Datatype::f2c(*type), *type_keyval, val); } void mpi_type_delete_attr_ (int* type, int* type_keyval, int* ierr){ @@ -72,9 +75,9 @@ void mpi_type_delete_attr_ (int* type, int* type_keyval, int* ierr){ } void mpi_type_create_keyval_ (void* copy_fn, void* delete_fn, int* keyval, void* extra_state, int* ierr){ - - *ierr = MPI_Type_create_keyval(reinterpret_cast(copy_fn), reinterpret_cast(delete_fn), - keyval, extra_state) ; + smpi_copy_fn _copy_fn={nullptr,nullptr,nullptr,nullptr,(*(int*)copy_fn) == 0 ? nullptr : reinterpret_cast(copy_fn),nullptr}; + smpi_delete_fn _delete_fn={nullptr,nullptr,nullptr,nullptr,(*(int*)delete_fn) == 0 ? nullptr : reinterpret_cast(delete_fn),nullptr}; + *ierr = simgrid::smpi::Keyval::keyval_create(_copy_fn, _delete_fn, keyval, extra_state); } void mpi_type_free_keyval_ (int* keyval, int* ierr) { @@ -128,29 +131,41 @@ void mpi_type_create_hvector_(int* count, int* blocklen, MPI_Aint* stride, int* } } -void mpi_type_hindexed_ (int* count, int* blocklens, MPI_Aint* indices, int* old_type, int* newtype, int* ierr) { +void mpi_type_hindexed_ (int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr) { MPI_Datatype tmp; - *ierr = MPI_Type_hindexed(*count, blocklens, indices, simgrid::smpi::Datatype::f2c(*old_type), &tmp); + MPI_Aint* indices_aint=new MPI_Aint[*count]; + for(int i=0; i<*count; i++) + indices_aint[i]=indices[i]; + *ierr = MPI_Type_hindexed(*count, blocklens, indices_aint, simgrid::smpi::Datatype::f2c(*old_type), &tmp); if(*ierr == MPI_SUCCESS) { *newtype = tmp->add_f(); } + delete[] indices_aint; } -void mpi_type_create_hindexed_(int* count, int* blocklens, MPI_Aint* indices, int* old_type, int* newtype, int* ierr){ +void mpi_type_create_hindexed_(int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr){ MPI_Datatype tmp; - *ierr = MPI_Type_create_hindexed(*count, blocklens, indices, simgrid::smpi::Datatype::f2c(*old_type), &tmp); + MPI_Aint* indices_aint=new MPI_Aint[*count]; + for(int i=0; i<*count; i++) + indices_aint[i]=indices[i]; + *ierr = MPI_Type_create_hindexed(*count, blocklens, indices_aint, simgrid::smpi::Datatype::f2c(*old_type), &tmp); if(*ierr == MPI_SUCCESS) { *newtype = tmp->add_f(); } + delete[] indices_aint; } -void mpi_type_create_hindexed_block_ (int* count, int* blocklength, MPI_Aint* indices, int* old_type, int* newtype, +void mpi_type_create_hindexed_block_ (int* count, int* blocklength, int* indices, int* old_type, int* newtype, int* ierr) { MPI_Datatype tmp; - *ierr = MPI_Type_create_hindexed_block(*count, *blocklength, indices, simgrid::smpi::Datatype::f2c(*old_type), &tmp); + MPI_Aint* indices_aint=new MPI_Aint[*count]; + for(int i=0; i<*count; i++) + indices_aint[i]=indices[i]; + *ierr = MPI_Type_create_hindexed_block(*count, *blocklength, indices_aint, simgrid::smpi::Datatype::f2c(*old_type), &tmp); if(*ierr == MPI_SUCCESS) { *newtype = tmp->add_f(); } + delete[] indices_aint; } void mpi_type_indexed_ (int* count, int* blocklens, int* indices, int* old_type, int* newtype, int* ierr) { @@ -178,32 +193,38 @@ void mpi_type_create_indexed_block_ (int* count, int* blocklength, int* indices, } } -void mpi_type_struct_ (int* count, int* blocklens, MPI_Aint* indices, int* old_types, int* newtype, int* ierr) { +void mpi_type_struct_ (int* count, int* blocklens, int* indices, int* old_types, int* newtype, int* ierr) { MPI_Datatype tmp; int i=0; MPI_Datatype* types = static_cast(xbt_malloc(*count*sizeof(MPI_Datatype))); + MPI_Aint* indices_aint=new MPI_Aint[*count]; for(i=0; i< *count; i++){ + indices_aint[i]=indices[i]; types[i] = simgrid::smpi::Datatype::f2c(old_types[i]); } - *ierr = MPI_Type_struct(*count, blocklens, indices, types, &tmp); + *ierr = MPI_Type_struct(*count, blocklens, indices_aint, types, &tmp); if(*ierr == MPI_SUCCESS) { *newtype = tmp->add_f(); } xbt_free(types); + delete[] indices_aint; } -void mpi_type_create_struct_(int* count, int* blocklens, MPI_Aint* indices, int* old_types, int* newtype, int* ierr){ +void mpi_type_create_struct_(int* count, int* blocklens, int* indices, int* old_types, int* newtype, int* ierr){ MPI_Datatype tmp; int i=0; MPI_Datatype* types = static_cast(xbt_malloc(*count*sizeof(MPI_Datatype))); + MPI_Aint* indices_aint=new MPI_Aint[*count]; for(i=0; i< *count; i++){ + indices_aint[i]=indices[i]; types[i] = simgrid::smpi::Datatype::f2c(old_types[i]); } - *ierr = MPI_Type_create_struct(*count, blocklens, indices, types, &tmp); + *ierr = MPI_Type_create_struct(*count, blocklens, indices_aint, types, &tmp); if(*ierr == MPI_SUCCESS) { *newtype = tmp->add_f(); } xbt_free(types); + delete[] indices_aint; } void mpi_pack_ (void* inbuf, int* incount, int* type, void* outbuf, int* outcount, int* position, int* comm, int* ierr) {