X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/45c3f1cfee86fb48c96d53f8267f99b6db6e3d7a..3f12121b93bc246909bf9f8e1615af532bd9a9b5:/src/smpi/smpi_mpi_dt.c diff --git a/src/smpi/smpi_mpi_dt.c b/src/smpi/smpi_mpi_dt.c index 8be8134291..7cb76b7949 100644 --- a/src/smpi/smpi_mpi_dt.c +++ b/src/smpi/smpi_mpi_dt.c @@ -123,14 +123,18 @@ CREATE_MPI_DATATYPE_NULL(MPI_PACKED); // Internal use only CREATE_MPI_DATATYPE(MPI_PTR, void*); +/** Check if the datatype is usable for communications + */ +int is_datatype_valid(MPI_Datatype datatype) { + return datatype != MPI_DATATYPE_NULL + && (datatype->flags & DT_FLAG_COMMITED); +} size_t smpi_datatype_size(MPI_Datatype datatype) { return datatype->size; } - - MPI_Aint smpi_datatype_lb(MPI_Datatype datatype) { return datatype->lb; @@ -157,7 +161,9 @@ int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype) { int count; - + if(smpi_privatize_global_variables){ + switch_data_segment(smpi_process_index()); + } /* First check if we really have something to do */ if (recvcount > 0 && recvbuf != sendbuf) { /* FIXME: treat packed cases */ @@ -324,7 +330,7 @@ void smpi_datatype_free(MPI_Datatype* type){ xbt_free((*type)->substruct); } xbt_free(*type); - + *type = MPI_DATATYPE_NULL; } void smpi_datatype_use(MPI_Datatype type){ @@ -1489,6 +1495,11 @@ void smpi_op_destroy(MPI_Op op) void smpi_op_apply(MPI_Op op, void *invec, void *inoutvec, int *len, MPI_Datatype * datatype) { + if(smpi_privatize_global_variables){ //we need to switch here, as the called function may silently touch global variables + XBT_VERB("Applying operation, switch to the right data frame "); + switch_data_segment(smpi_process_index()); + } + if(!_xbt_replay_is_active()) op->func(invec, inoutvec, len, datatype); }