Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Make spelling uniform: privatisation -> privatization
[simgrid.git] / src / mc / Process.cpp
index 42a6bd0..d4d71ea 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2014-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2014-2017. 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. */
 
-#define _FILE_OFFSET_BITS 64
+#define _FILE_OFFSET_BITS 64 /* needed for pread_whole to work as expected on 32bits */
 
 #include <assert.h>
 #include <stddef.h>
 #include <libunwind.h>
 #include <libunwind-ptrace.h>
 
-#include <xbt/log.h>
-#include <xbt/base.h>
+#include "xbt/base.h"
+#include "xbt/log.h"
 #include <xbt/mmalloc.h>
 
 #include "src/mc/mc_unw.h"
 #include "src/mc/mc_snapshot.h"
-#include "src/mc/mc_ignore.h"
 #include "src/mc/mc_smx.h"
 
 #include "src/mc/Process.hpp"
@@ -56,39 +54,54 @@ namespace mc {
 #define VERSION_RE "-[\\.0-9-]*$"
 
 // List of library which memory segments are not considered:
-static const char *const filtered_libraries[] = {
-  "ld",
-  "libasan", /* gcc sanitizer */
-  "libbz2",
-  "libboost_chrono",
-  "libboost_context",
-  "libboost_system",
-  "libboost_thread",
-  "libc",
-  "libc++",
-  "libcdt",
-  "libcgraph",
-  "libdl",
-  "libdw",
-  "libelf",
-  "libgcc_s",
-  "liblua5.1",
-  "liblua5.3",
-  "liblzma",
-  "libm",
-  "libpthread",
-  "librt",
-  "libstdc++",
-  "libunwind",
-  "libunwind-x86_64",
-  "libunwind-x86",
-  "libunwind-ptrace",
-  "libz"
-};
+static const char* const filtered_libraries[] = {
+#ifdef __linux__
+    "ld",
+#elif defined __FreeBSD__
+    "ld-elf",
+    "ld-elf32",
+    "libkvm",      /* kernel data access library */
+    "libprocstat", /* process and file information retrieval */
+    "libthr",      /* thread library */
+    "libutil",
+#endif
+    "libasan", /* gcc sanitizers */
+    "libargp", /* workarounds for glibc-less systems */
+    "libtsan",
+    "libubsan",
+    "libbz2",
+    "libboost_chrono",
+    "libboost_context",
+    "libboost_context-mt",
+    "libboost_system",
+    "libboost_thread",
+    "libc",
+    "libc++",
+    "libcdt",
+    "libcgraph",
+    "libcrypto",
+    "libcxxrt",
+    "libdl",
+    "libdw",
+    "libelf",
+    "libevent",
+    "libgcc_s",
+    "liblua5.1",
+    "liblua5.3",
+    "liblzma",
+    "libm",
+    "libpthread",
+    "librt",
+    "libstdc++",
+    "libunwind",
+    "libunwind-x86_64",
+    "libunwind-x86",
+    "libunwind-ptrace",
+    "libz"};
 
 static bool is_simgrid_lib(const char* libname)
 {
-  return !strcmp(libname, "libsimgrid");
+  return not strcmp(libname, "libsimgrid");
 }
 
 static bool is_filtered_lib(const char* libname)
@@ -119,7 +132,7 @@ static char* get_lib_name(const char* pathname, struct s_mc_memory_map_re* res)
   map_basename = nullptr;
 
   // Strip the version suffix:
-  if(libname && !regexec(&res->version_re, libname, 1, &match, 0)) {
+  if (libname && not regexec(&res->version_re, libname, 1, &match, 0)) {
     char* temp = libname;
     libname = strndup(temp, match.rm_so);
     free(temp);
@@ -128,12 +141,12 @@ static char* get_lib_name(const char* pathname, struct s_mc_memory_map_re* res)
   return libname;
 }
 
-static ssize_t pread_whole(int fd, void *buf, size_t count, std::uint64_t offset)
+static ssize_t pread_whole(int fd, void *buf, size_t count, off_t offset)
 {
   char* buffer = (char*) buf;
   ssize_t real_count = count;
   while (count) {
-    ssize_t res = pread(fd, buffer, count, (std::int64_t) offset);
+    ssize_t res = pread(fd, buffer, count, offset);
     if (res > 0) {
       count  -= res;
       buffer += res;
@@ -170,7 +183,7 @@ static pthread_once_t zero_buffer_flag = PTHREAD_ONCE_INIT;
 static const void* zero_buffer;
 static const size_t zero_buffer_size = 10 * 4096;
 
-static void zero_buffer_init(void)
+static void zero_buffer_init()
 {
   int fd = open("/dev/zero", O_RDONLY);
   if (fd<0)
@@ -211,16 +224,16 @@ void Process::init()
 
   // Read std_heap (is a struct mdesc*):
   simgrid::mc::Variable* std_heap_var = this->find_variable("__mmalloc_default_mdp");
-  if (!std_heap_var)
+  if (not std_heap_var)
     xbt_die("No heap information in the target process");
-  if(!std_heap_var->address)
+  if (not std_heap_var->address)
     xbt_die("No constant address for this variable");
   this->read_bytes(&this->heap_address, sizeof(struct mdesc*),
     remote(std_heap_var->address),
     simgrid::mc::ProcessIndexDisabled);
 
-  this->smx_process_infos.clear();
-  this->smx_old_process_infos.clear();
+  this->smx_actors_infos.clear();
+  this->smx_dead_actors_infos.clear();
   this->unw_addr_space = simgrid::mc::UnwindContext::createUnwindAddressSpace();
   this->unw_underlying_addr_space = simgrid::unw::create_addr_space();
   this->unw_underlying_context = simgrid::unw::create_context(
@@ -233,8 +246,10 @@ Process::~Process()
     close(this->memory_file);
 
   if (this->unw_underlying_addr_space != unw_local_addr_space) {
-    unw_destroy_addr_space(this->unw_underlying_addr_space);
-    _UPT_destroy(this->unw_underlying_context);
+    if (this->unw_underlying_addr_space)
+      unw_destroy_addr_space(this->unw_underlying_addr_space);
+    if (this->unw_underlying_context)
+      _UPT_destroy(this->unw_underlying_context);
   }
 
   unw_destroy_addr_space(this->unw_addr_space);
@@ -248,7 +263,7 @@ Process::~Process()
 void Process::refresh_heap()
 {
   // Read/dereference/refresh the std_heap pointer:
-  if (!this->heap)
+  if (not this->heap)
     this->heap = std::unique_ptr<s_xbt_mheap_t>(new s_xbt_mheap_t());
   this->read_bytes(this->heap.get(), sizeof(struct mdesc),
     remote(this->heap_address), simgrid::mc::ProcessIndexDisabled);
@@ -306,7 +321,7 @@ void Process::init_memory_map_info()
 
     // [stack], [vvar], [vsyscall], [vdso] ...
     if (pathname[0] == '[') {
-      if ((reg.prot & PROT_WRITE) && !memcmp(pathname, "[stack]", 7)) {
+      if ((reg.prot & PROT_WRITE) && not memcmp(pathname, "[stack]", 7)) {
         this->maestro_stack_start_ = remote(reg.start_addr);
         this->maestro_stack_end_ = remote(reg.end_addr);
       }
@@ -318,14 +333,14 @@ void Process::init_memory_map_info()
       continue;
 
     current_name = pathname;
-    if (!(reg.prot & PROT_READ) && (reg.prot & PROT_EXEC))
+    if (not(reg.prot & PROT_READ) && (reg.prot & PROT_EXEC))
       continue;
 
-    const bool is_executable = !i;
+    const bool is_executable = not i;
     char* libname = nullptr;
-    if (!is_executable) {
+    if (not is_executable) {
       libname = get_lib_name(pathname, &res);
-      if(!libname)
+      if (not libname)
         continue;
       if (is_filtered_lib(libname)) {
         free(libname);
@@ -416,19 +431,16 @@ simgrid::mc::Variable* Process::find_variable(const char* name) const
 void Process::read_variable(const char* name, void* target, size_t size) const
 {
   simgrid::mc::Variable* var = this->find_variable(name);
-  if (!var->address)
-    xbt_die("No simple location for this variable");
-  if (!var->type->full_type)
-    xbt_die("Partial type for %s, cannot check size", name);
-  if ((size_t) var->type->full_type->byte_size != size)
-    xbt_die("Unexpected size for %s (expected %zi, was %zi)",
-      name, size, (size_t) var->type->full_type->byte_size);
+  xbt_assert(var->address, "No simple location for this variable");
+  xbt_assert(var->type->full_type, "Partial type for %s, cannot check size", name);
+  xbt_assert((size_t)var->type->full_type->byte_size == size, "Unexpected size for %s (expected %zi, was %zi)", name,
+             size, (size_t)var->type->full_type->byte_size);
   this->read_bytes(target, size, remote(var->address));
 }
 
 std::string Process::read_string(RemotePtr<char> address) const
 {
-  if (!address)
+  if (not address)
     return {};
 
   // TODO, use std::vector with .data() in C++17 to avoid useless copies
@@ -471,37 +483,35 @@ const void *Process::read_bytes(void* buffer, std::size_t size,
       if (process_index >= (int) MC_smpi_process_count())
         xbt_die("Invalid process index");
 
-      // Read smpi_privatisation_regions from MCed:
-      smpi_privatisation_region_t remote_smpi_privatisation_regions =
-        mc_model_checker->process().read_variable<smpi_privatisation_region_t>(
-          "smpi_privatisation_regions");
+      // Read smpi_privatization_regions from MCed:
+      smpi_privatization_region_t remote_smpi_privatization_regions =
+        mc_model_checker->process().read_variable<smpi_privatization_region_t>(
+          "smpi_privatization_regions");
 
-      s_smpi_privatisation_region_t privatisation_region =
-        mc_model_checker->process().read<s_smpi_privatisation_region_t>(
-          remote(remote_smpi_privatisation_regions + process_index));
+      s_smpi_privatization_region_t privatization_region =
+        mc_model_checker->process().read<s_smpi_privatization_region_t>(
+          remote(remote_smpi_privatization_regions + process_index));
 
       // Address translation in the privatization segment:
       size_t offset = address.address() - (std::uint64_t)info->start_rw;
-      address = remote((char*)privatisation_region.address + offset);
+      address = remote((char*)privatization_region.address + offset);
     }
 #endif
   }
-
-  if (pread_whole(this->memory_file, buffer, size, address.address()) < 0)
-    xbt_die("Read from process %lli failed", (long long) this->pid_);
+  if (pread_whole(this->memory_file, buffer, size, (size_t) address.address()) < 0)
+    xbt_die("Read at %p from process %lli failed", (void*)address.address(), (long long)this->pid_);
   return buffer;
 }
 
 /** Write data to a process memory
  *
- *  @param process the process
- *  @param local   local memory address (source)
- *  @param remote  target process memory address (target)
- *  @param len     data size
+ *  @param buffer   local memory address (source)
+ *  @param len      data size
+ *  @param address  target process memory address (target)
  */
 void Process::write_bytes(const void* buffer, size_t len, RemotePtr<void> address)
 {
-  if (pwrite_whole(this->memory_file, buffer, len, address.address()) < 0)
+  if (pwrite_whole(this->memory_file, buffer, len,  (size_t)address.address()) < 0)
     xbt_die("Write to process %lli failed", (long long) this->pid_);
 }
 
@@ -633,21 +643,21 @@ void Process::ignore_local_variable(const char *var_name, const char *frame_name
     info->remove_local_variable(var_name, frame_name);
 }
 
-std::vector<simgrid::mc::SimixProcessInformation>& Process::simix_processes()
+std::vector<simgrid::mc::ActorInformation>& Process::actors()
 {
   this->refresh_simix();
-  return smx_process_infos;
+  return smx_actors_infos;
 }
 
-std::vector<simgrid::mc::SimixProcessInformation>& Process::old_simix_processes()
+std::vector<simgrid::mc::ActorInformation>& Process::dead_actors()
 {
   this->refresh_simix();
-  return smx_old_process_infos;
+  return smx_dead_actors_infos;
 }
 
 void Process::dumpStack()
 {
-  unw_addr_space_t as = unw_create_addr_space(&_UPT_accessors, __BYTE_ORDER);
+  unw_addr_space_t as = unw_create_addr_space(&_UPT_accessors, BYTE_ORDER);
   if (as == nullptr) {
     XBT_ERROR("Could not initialize ptrace address space");
     return;