Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : don't need to reset the result of simcal actually, remove unnecessary...
[simgrid.git] / src / smpi / smpi_mpi_dt.c
index 17e7614..19f0228 100644 (file)
@@ -181,7 +181,7 @@ int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 
       s_smpi_mpi_vector_t* type_c = (s_smpi_mpi_vector_t*)sendtype;
 
-      void * buf_tmp = malloc(count * type_c->size_oldtype);
+      void * buf_tmp = xbt_malloc(count * type_c->size_oldtype);
 
       subtype->serialize( sendbuf, buf_tmp,1, subtype);
       subtype =  recvtype->substruct;
@@ -295,14 +295,35 @@ void smpi_datatype_create(MPI_Datatype* new_type, int size,int lb, int ub, int h
   new_t->ub = ub;
   new_t->flags = flags;
   new_t->substruct = struct_type;
+  new_t->in_use=0;
   *new_type = new_t;
 }
 
 void smpi_datatype_free(MPI_Datatype* type){
+
+  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)->has_subtype == 1){
     ((s_smpi_subtype_t *)(*type)->substruct)->subtype_free(type);  
   }
   xbt_free(*type);
+
+}
+
+void smpi_datatype_use(MPI_Datatype type){
+  if(type)type->in_use++;
+}
+
+
+void smpi_datatype_unuse(MPI_Datatype type){
+  if(type && type->in_use-- == 0 && (type->flags & DT_FLAG_DESTROYED))
+    smpi_datatype_free(&type);
 }
 
 int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type)