Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
in gras_dynar_cursor_rm, we want to get the content to free it if there is a
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 6 Jul 2004 07:34:20 +0000 (07:34 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 6 Jul 2004 07:34:20 +0000 (07:34 +0000)
free_func. But take care of writing it into a variable big enough, little
scarabee...

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@181 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/xbt/dynar.c

index 8a65bc5..3cedd0e 100644 (file)
@@ -551,7 +551,21 @@ void gras_dynar_cursor_rm(gras_dynar_t * dynar,
                          int          * const cursor) {
   void *dst;
 
                          int          * const cursor) {
   void *dst;
 
-  gras_dynar_remove_at(dynar,(*cursor)--,&dst);
-  if (dynar->free)
-    (dynar->free)(dst);
+  if (dynar->elmsize > sizeof(void*)) {
+    DEBUG0("Elements too big to fit into a pointer");
+    if (dynar->free) {
+      dst=malloc(dynar->elmsize);
+      gras_dynar_remove_at(dynar,(*cursor)--,dst);
+      (dynar->free)(dst);
+      free(dst);
+    } else {
+      DEBUG0("Ok, we dont care about the element when no free function");
+      gras_dynar_remove_at(dynar,(*cursor)--,NULL);
+    }
+      
+  } else {
+    gras_dynar_remove_at(dynar,(*cursor)--,&dst);
+    if (dynar->free)
+      (dynar->free)(dst);
+  }
 }
 }