Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
plug a (damn) memleak. Gosh, this one was hard to get, too
authorMartin Quinson <martin.quinson@loria.fr>
Sun, 25 Nov 2012 13:21:06 +0000 (14:21 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Sun, 25 Nov 2012 13:21:06 +0000 (14:21 +0100)
src/xbt/xbt_replay.c
src/xbt/xbt_str.c

index 116b0bc..c0dbca1 100644 (file)
@@ -133,12 +133,15 @@ void _xbt_replay_action_exit(void)
 int xbt_replay_action_runner(int argc, char *argv[])
 {
   const char **evt;
 int xbt_replay_action_runner(int argc, char *argv[])
 {
   const char **evt;
+  int i;
   if (action_fp) {              // A unique trace file
 
     while ((evt = action_get_action(argv[0]))) {
       action_fun function =
         (action_fun)xbt_dict_get(action_funs, evt[1]);
       function(evt);
   if (action_fp) {              // A unique trace file
 
     while ((evt = action_get_action(argv[0]))) {
       action_fun function =
         (action_fun)xbt_dict_get(action_funs, evt[1]);
       function(evt);
+      for (i=0;evt[i]!= NULL;i++)
+        free((char*)evt[i]);
       free(evt);
     }
   } else {                      // Should have got my trace file in argument
       free(evt);
     }
   } else {                      // Should have got my trace file in argument
@@ -153,6 +156,8 @@ int xbt_replay_action_runner(int argc, char *argv[])
         action_fun function =
           (action_fun)xbt_dict_get(action_funs, evt[1]);
         function(evt);
         action_fun function =
           (action_fun)xbt_dict_get(action_funs, evt[1]);
         function(evt);
+        for (i=0;evt[i]!= NULL;i++)
+          free((char*)evt[i]);
         free(evt);
       } else {
         XBT_WARN("%s: Ignore trace element not for me",
         free(evt);
       } else {
         XBT_WARN("%s: Ignore trace element not for me",
index d698133..e4ea184 100644 (file)
@@ -327,11 +327,14 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep)
  *
  * The string passed as argument must be writable (not const)
  * The elements of the dynar are just parts of the string passed as argument.
  *
  * The string passed as argument must be writable (not const)
  * The elements of the dynar are just parts of the string passed as argument.
+ * So if you don't store that argument elsewhere, you should free it in addition
+ * to freeing the dynar. This can be done by simply freeing the first argument
+ * of the dynar:
+ *  free(xbt_dynar_get_ptr(dynar,0));
  *
  *
- * To free the structure constructed by this function, free the first element and free the dynar:
- *
- * free(xbt_dynar_get_ptr(dynar,0));
- * xbt_dynar_free(&dynar);
+ * Actually this function puts a bunch of \0 in the memory area you passed as
+ * argument to separate the elements, and pushes the address of each chunk
+ * in the resulting dynar. Yes, that's uneven. Yes, that's gory. But that's efficient.
  */
 xbt_dynar_t xbt_str_split_quoted_in_place(char *s) {
   xbt_dynar_t res = xbt_dynar_new(sizeof(char *), NULL);
  */
 xbt_dynar_t xbt_str_split_quoted_in_place(char *s) {
   xbt_dynar_t res = xbt_dynar_new(sizeof(char *), NULL);