Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
smpi_replay: allow to register extra events before things start (+plug a memleak)
[simgrid.git] / src / xbt / xbt_replay.cpp
index 705cd0f..d0b7197 100644 (file)
@@ -4,6 +4,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include <xbt/ex.hpp>
 #include "src/internal_config.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
@@ -28,10 +29,10 @@ typedef struct s_replay_reader {
 
 FILE *xbt_action_fp;
 
-xbt_dict_t xbt_action_funs = NULL;
-xbt_dict_t xbt_action_queues = NULL;
+xbt_dict_t xbt_action_funs = nullptr;
+xbt_dict_t xbt_action_queues = nullptr;
 
-static char *action_line = NULL;
+static char *action_line = nullptr;
 static size_t action_len = 0;
 
 int is_replay_active = 0 ;
@@ -47,7 +48,7 @@ static char *str_tolower (const char *str)
   return ret;
 }
 
-int _xbt_replay_is_active(void){
+int _xbt_replay_is_active(){
   return is_replay_active;
 }
 
@@ -55,7 +56,7 @@ xbt_replay_reader_t xbt_replay_reader_new(const char *filename)
 {
   xbt_replay_reader_t res = xbt_new0(s_xbt_replay_reader_t,1);
   res->fp = fopen(filename, "r");
-  xbt_assert(res->fp != NULL, "Cannot open %s: %s", filename, strerror(errno));
+  xbt_assert(res->fp != nullptr, "Cannot open %s: %s", filename, strerror(errno));
   res->filename = xbt_strdup(filename);
   return res;
 }
@@ -68,11 +69,11 @@ const char **xbt_replay_reader_get(xbt_replay_reader_t reader)
   //XBT_INFO("got from trace: %s",reader->line);
   reader->linenum++;
   if (read==-1)
-    return NULL; /* end of file */
+    return nullptr; /* end of file */
   char *comment = strchr(reader->line, '#');
-  if (comment != NULL)
+  if (comment != nullptr)
     *comment = '\0';
-  xbt_str_trim(reader->line, NULL);
+  xbt_str_trim(reader->line, nullptr);
   if (reader->line[0] == '\0')
     return xbt_replay_reader_get(reader); /* Get next line */
 
@@ -91,7 +92,7 @@ void xbt_replay_reader_free(xbt_replay_reader_t *reader)
   fclose((*reader)->fp);
   free((*reader)->line);
   free(*reader);
-  *reader=NULL;
+  *reader=nullptr;
 }
 
 /**
@@ -108,8 +109,11 @@ void xbt_replay_reader_free(xbt_replay_reader_t *reader)
  */
 void xbt_replay_action_register(const char *action_name, action_fun function)
 {
+  if (xbt_action_funs == nullptr) // If the user registers a function before the start
+    _xbt_replay_action_init();
+
   char* lowername = str_tolower (action_name);
-  xbt_dict_set(xbt_action_funs, lowername, (void*) function, NULL);
+  xbt_dict_set(xbt_action_funs, lowername, (void*) function, nullptr);
   xbt_free(lowername);
 }
 
@@ -117,24 +121,24 @@ void xbt_replay_action_register(const char *action_name, action_fun function)
  *
  * It returns false if it was already done by another process.
  */
-int _xbt_replay_action_init(void)
+int _xbt_replay_action_init()
 {
   if (xbt_action_funs)
     return 0;
   is_replay_active = 1;
-  xbt_action_funs = xbt_dict_new_homogeneous(NULL);
-  xbt_action_queues = xbt_dict_new_homogeneous(NULL);
+  xbt_action_funs = xbt_dict_new_homogeneous(nullptr);
+  xbt_action_queues = xbt_dict_new_homogeneous(nullptr);
   return 1;
 }
 
-void _xbt_replay_action_exit(void)
+void _xbt_replay_action_exit()
 {
   xbt_dict_free(&xbt_action_queues);
   xbt_dict_free(&xbt_action_funs);
   free(action_line);
-  xbt_action_queues = NULL;
-  xbt_action_funs = NULL;
-  action_line = NULL;
+  xbt_action_queues = nullptr;
+  xbt_action_funs = nullptr;
+  action_line = nullptr;
 }
 
 /**
@@ -146,12 +150,11 @@ void _xbt_replay_action_exit(void)
  */
 int xbt_replay_action_runner(int argc, char *argv[])
 {
-  int i;
   if (xbt_action_fp) {              // A unique trace file
     while (true) {
       char **evt = action_get_action(argv[0]);
       if (evt == nullptr)
-        break;
+        break;
 
       char* lowername = str_tolower (evt[1]);
       action_fun function = (action_fun)xbt_dict_get(xbt_action_funs, lowername);
@@ -162,7 +165,7 @@ int xbt_replay_action_runner(int argc, char *argv[])
       catch(xbt_ex& e) {
         xbt_die("Replay error :\n %s", e.what());
       }
-      for (i=0;evt[i]!= NULL;i++)
+      for (int i=0;evt[i]!= nullptr;i++)
         free(evt[i]);
       free(evt);
     }
@@ -196,12 +199,12 @@ int xbt_replay_action_runner(int argc, char *argv[])
 
 static char **action_get_action(char *name)
 {
-  xbt_dynar_t evt = NULL;
-  char *evtname = NULL;
+  xbt_dynar_t evt = nullptr;
+  char *evtname = nullptr;
 
   xbt_dynar_t myqueue = (xbt_dynar_t) xbt_dict_get_or_null(xbt_action_queues, name);
-  if (myqueue == NULL || xbt_dynar_is_empty(myqueue)) {      // nothing stored for me. Read the file further
-    if (xbt_action_fp == NULL) {    // File closed now. There's nothing more to read. I'm out of here
+  if (myqueue == nullptr || xbt_dynar_is_empty(myqueue)) {      // nothing stored for me. Read the file further
+    if (xbt_action_fp == nullptr) {    // File closed now. There's nothing more to read. I'm out of here
       goto todo_done;
     }
     // Read lines until I reach something for me (which breaks in loop body)
@@ -209,9 +212,9 @@ static char **action_get_action(char *name)
     while (xbt_getline(&action_line, &action_len, xbt_action_fp) != -1) {
       // cleanup and split the string I just read
       char *comment = strchr(action_line, '#');
-      if (comment != NULL)
+      if (comment != nullptr)
         *comment = '\0';
-      xbt_str_trim(action_line, NULL);
+      xbt_str_trim(action_line, nullptr);
       if (action_line[0] == '\0')
         continue;
       /* we cannot split in place here because we parse&store several lines for
@@ -226,14 +229,14 @@ static char **action_get_action(char *name)
         // Else, I have to store it for the relevant colleague
         xbt_dynar_t otherqueue =
             (xbt_dynar_t) xbt_dict_get_or_null(xbt_action_queues, evtname);
-        if (otherqueue == NULL) {       // Damn. Create the queue of that guy
+        if (otherqueue == nullptr) {       // Damn. Create the queue of that guy
           otherqueue = xbt_dynar_new(sizeof(xbt_dynar_t), xbt_dynar_free_voidp);
-          xbt_dict_set(xbt_action_queues, evtname, otherqueue, NULL);
+          xbt_dict_set(xbt_action_queues, evtname, otherqueue, nullptr);
         }
         xbt_dynar_push(otherqueue, &evt);
       }
     }
-    goto todo_done;             // end of file reached while searching in vain for more work
+    // end of file reached while searching in vain for more work
   } else {
     // Get something from my queue and return it
     xbt_dynar_shift(myqueue, &evt);
@@ -243,9 +246,9 @@ static char **action_get_action(char *name)
   // I did all my actions for me in the file (either I closed the file, or a colleague did)
   // Let's cleanup before leaving
 todo_done:
-  if (myqueue != NULL) {
+  if (myqueue != nullptr) {
     xbt_dynar_free(&myqueue);
     xbt_dict_remove(xbt_action_queues, name);
   }
-  return NULL;
+  return nullptr;
 }