*new_t= xbt_new(s_smpi_mpi_datatype_t,1);
memcpy(*new_t, datatype, sizeof(s_smpi_mpi_datatype_t));
(*new_t)->in_use=1;
+ (*new_t)->flags &= ~DT_FLAG_PREDEFINED;
if (datatype->sizeof_substruct){
(*new_t)->substruct=xbt_malloc(datatype->sizeof_substruct);
memcpy((*new_t)->substruct, datatype->substruct, datatype->sizeof_substruct);
}
void smpi_datatype_set_name(MPI_Datatype datatype, char* name){
+ if(datatype->name!=NULL && !(datatype->flags & DT_FLAG_PREDEFINED))
+ xbt_free(datatype->name);
datatype->name = xbt_strdup(name);;
}
void smpi_datatype_free(MPI_Datatype* type){
xbt_assert((*type)->in_use >= 0);
+
+ if((*type)->flags & DT_FLAG_PREDEFINED)return;
+
+ //if still used, mark for deletion
+ if((*type)->in_use!=0){
+ (*type)->flags |=DT_FLAG_DESTROYED;
+ return;
+ }
+
if((*type)->attributes !=NULL){
xbt_dict_cursor_t cursor = NULL;
int* key;
}
}
- if((*type)->flags & DT_FLAG_PREDEFINED)return;
-
- //if still used, mark for deletion
- if((*type)->in_use!=0){
- (*type)->flags |=DT_FLAG_DESTROYED;
- return;
- }
-
if ((*type)->sizeof_substruct != 0){
//((s_smpi_subtype_t *)(*type)->substruct)->subtype_free(type);
xbt_free((*type)->substruct);
}
- if ((*type)->name != NULL){
- xbt_free((*type)->name);
- }
+ xbt_free((*type)->name);
+ xbt_free(*type);
*type = MPI_DATATYPE_NULL;
}
}
if(type && type->in_use == 0){
- MPI_Datatype t = type;
- if (!(type->flags & DT_FLAG_DESTROYED))
- smpi_datatype_free(&type);
- if(t->flags & DT_FLAG_PREDEFINED) return;
- xbt_free(t);
+ smpi_datatype_free(&type);
}
#if HAVE_MC
if(MC_is_active())