Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove/cleanup/fix #include
[simgrid.git] / src / mc / mc_record.cpp
index 6734597..f0ff676 100644 (file)
@@ -1,22 +1,31 @@
-/* Copyright (c) 2014. The SimGrid Team.
+/* Copyright (c) 2014-2015. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* 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 <stdio.h>
-#include <stdlib.h>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
 
-#include <xbt.h>
-#include <simgrid/simix.h>
+#include <xbt/fifo.h>
+#include <xbt/log.h>
+#include <xbt/sysdep.h>
 
-#include "mc_record.h"
-#include "mc_base.h"
+#include "simgrid/simix.h"
+
+#include "src/simix/smx_private.h"
+#include "src/simix/smx_process_private.h"
+
+#include "src/mc/mc_replay.h"
+#include "src/mc/mc_record.h"
+#include "src/mc/mc_base.h"
 
 #ifdef HAVE_MC
-#include "mc_private.h"
-#include "mc_state.h"
-#include "mc_smx.h"
+#include "src/mc/mc_private.h"
+#include "src/mc/mc_state.h"
+#include "src/mc/mc_smx.h"
+#include "src/mc/mc_liveness.h"
 #endif
 
 extern "C" {
@@ -24,9 +33,9 @@ extern "C" {
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_record, mc,
   " Logging specific to MC record/replay facility");
 
-char* MC_record_path = NULL;
+char* MC_record_path = nullptr;
 
-void MC_record_replay(mc_record_item_t start, size_t len)
+void MC_record_replay(mc_record_item_t start, std::size_t len)
 {
   MC_wait_for_requests();
   mc_record_item_t end = start + len;
@@ -60,9 +69,9 @@ xbt_dynar_t MC_record_from_string(const char* data)
 {
   XBT_INFO("path=%s", data);
   if (!data || !data[0])
-    return NULL;
+    return nullptr;
 
-  xbt_dynar_t dynar = xbt_dynar_new(sizeof(s_mc_record_item_t), NULL);
+  xbt_dynar_t dynar = xbt_dynar_new(sizeof(s_mc_record_item_t), nullptr);
 
   const char* current = data;
   while (*current) {
@@ -74,8 +83,8 @@ xbt_dynar_t MC_record_from_string(const char* data)
     xbt_dynar_push(dynar, &item);
 
     // Find next chunk:
-    const char* end = strchr(current, ';');
-    if(end==NULL)
+    const char* end = std::strchr(current, ';');
+    if(end == nullptr)
       break;
     else
       current = end + 1;
@@ -85,12 +94,44 @@ xbt_dynar_t MC_record_from_string(const char* data)
 
 fail:
   xbt_dynar_free(&dynar);
-  return NULL;
+  return nullptr;
 }
 
 #ifdef HAVE_MC
+static char* MC_record_stack_to_string_liveness(xbt_fifo_t stack)
+{
+  char* buffer;
+  std::size_t size;
+  std::FILE* file = open_memstream(&buffer, &size);
+
+  xbt_fifo_item_t item;
+  xbt_fifo_item_t start = xbt_fifo_get_last_item(stack);
+  for (item = start; item; item = xbt_fifo_get_prev_item(item)) {
+    mc_pair_t pair = (mc_pair_t) xbt_fifo_get_item_content(item);
+    int value;
+    smx_simcall_t req = MC_state_get_executed_request(pair->graph_state, &value);
+    if (req && req->call != SIMCALL_NONE) {
+      smx_process_t issuer = MC_smx_simcall_get_issuer(req);
+      const int pid = issuer->pid;
+
+      // Serialization the (pid, value) pair:
+      const char* sep = (item!=start) ? ";" : "";
+      if (value)
+        std::fprintf(file, "%s%u/%u", sep, pid, value);
+      else
+        std::fprintf(file, "%s%u", sep, pid);
+    }
+  }
+
+  std::fclose(file);
+  return buffer;
+}
+
 char* MC_record_stack_to_string(xbt_fifo_t stack)
 {
+  if (_sg_mc_liveness)
+    return MC_record_stack_to_string_liveness(stack);
+
   xbt_fifo_item_t start = xbt_fifo_get_last_item(stack);
 
   if (!start) {
@@ -100,8 +141,8 @@ char* MC_record_stack_to_string(xbt_fifo_t stack)
   }
 
   char* buffer;
-  size_t size;
-  FILE* file = open_memstream(&buffer, &size);
+  std::size_t size;
+  std::FILE* file = open_memstream(&buffer, &size);
 
   xbt_fifo_item_t item;
   for (item = start; item; item = xbt_fifo_get_prev_item(item)) {
@@ -116,12 +157,12 @@ char* MC_record_stack_to_string(xbt_fifo_t stack)
     // Serialization the (pid, value) pair:
     const char* sep = (item!=start) ? ";" : "";
     if (value)
-      fprintf(file, "%s%u/%u", sep, pid, value);
+      std::fprintf(file, "%s%u/%u", sep, pid, value);
     else
-      fprintf(file, "%s%u", sep, pid);
+      std::fprintf(file, "%s%u", sep, pid);
   }
 
-  fclose(file);
+  std::fclose(file);
   return buffer;
 }
 
@@ -130,7 +171,7 @@ void MC_record_dump_path(xbt_fifo_t stack)
   if (MC_record_is_active()) {
     char* path = MC_record_stack_to_string(stack);
     XBT_INFO("Path = %s", path);
-    free(path);
+    std::free(path);
   }
 }
 #endif