Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Don't use pass-by-value for large parameters.
[simgrid.git] / src / mc / remote / RemoteClient.cpp
index d24507b..9904e03 100644 (file)
@@ -1,47 +1,20 @@
-/* Copyright (c) 2014-2017. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2014-2019. 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 /* needed for pread_whole to work as expected on 32bits */
 
-#include <algorithm>
-#include <cassert>
-#include <cerrno>
-#include <cstddef>
-#include <cstdint>
-#include <string>
-#include <vector>
-
-#include <sys/ptrace.h>
-
-#include <cstdio>
-
-#include <fcntl.h>
-#include <sys/mman.h> // PROT_*
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <pthread.h>
-
-#include <libgen.h>
-
-#include <libunwind-ptrace.h>
-#include <libunwind.h>
+#include "src/mc/remote/RemoteClient.hpp"
 
-#include "xbt/base.h"
 #include "xbt/file.hpp"
 #include "xbt/log.h"
-#include <xbt/mmalloc.h>
-
 #include "src/mc/mc_smx.hpp"
-#include "src/mc/mc_snapshot.hpp"
-#include "src/mc/mc_unw.hpp"
+#include "src/mc/sosp/mc_snapshot.hpp"
 
-#include "src/mc/AddressSpace.hpp"
-#include "src/mc/ObjectInformation.hpp"
-#include "src/mc/Variable.hpp"
-#include "src/mc/remote/RemoteClient.hpp"
+#include <fcntl.h>
+#include <libunwind-ptrace.h>
+#include <sys/mman.h> // PROT_*
 
 using simgrid::mc::remote;
 
@@ -64,16 +37,16 @@ static const std::vector<std::string> filtered_libraries = {
     "libthr",      /* thread library */
     "libutil",
 #endif
-    "libasan", /* gcc sanitizers */
     "libargp", /* workarounds for glibc-less systems */
-    "libtsan",
-    "libubsan",
-    "libbz2",
+    "libasan", /* gcc sanitizers */
     "libboost_chrono",
     "libboost_context",
     "libboost_context-mt",
+    "libboost_stacktrace_backtrace",
     "libboost_system",
     "libboost_thread",
+    "libboost_timer",
+    "libbz2",
     "libc",
     "libc++",
     "libcdt",
@@ -84,18 +57,33 @@ static const std::vector<std::string> filtered_libraries = {
     "libdw",
     "libelf",
     "libevent",
+    "libexecinfo",
+    "libflang",
+    "libflangrti",
     "libgcc_s",
+    "libgfortran",
+    "libimf",
+    "libintlc",
+    "libirng",
     "liblua5.1",
     "liblua5.3",
     "liblzma",
     "libm",
+    "libomp",
+    "libpapi",
+    "libpfm",
+    "libpgmath",
     "libpthread",
+    "libquadmath",
     "librt",
     "libstdc++",
+    "libsvml",
+    "libtsan",  /* gcc sanitizers */
+    "libubsan", /* gcc sanitizers */
     "libunwind",
-    "libunwind-x86_64",
-    "libunwind-x86",
     "libunwind-ptrace",
+    "libunwind-x86",
+    "libunwind-x86_64",
     "libz"};
 
 static bool is_simgrid_lib(const std::string& libname)
@@ -110,19 +98,18 @@ static bool is_filtered_lib(const std::string& libname)
 
 static std::string get_lib_name(const std::string& pathname)
 {
-  constexpr char digits[]  = ".0123456789";
-  std::string map_basename = simgrid::xbt::Path(pathname).getBasename();
+  std::string map_basename = simgrid::xbt::Path(pathname).get_base_name();
   std::string libname;
 
   size_t pos = map_basename.rfind(".so");
-  if (pos != std::string::npos && map_basename.find_first_not_of(digits, pos + 3) == std::string::npos) {
-    // strip the extension (matching regex "\.so[.0-9]*$")
+  if (pos != std::string::npos) {
+    // strip the extension (matching regex "\.so.*$")
     libname.assign(map_basename, 0, pos);
 
     // strip the version suffix (matching regex "-[.0-9-]*$")
     while (true) {
       pos = libname.rfind('-');
-      if (pos == std::string::npos || libname.find_first_not_of(digits, pos + 1) != std::string::npos)
+      if (pos == std::string::npos || libname.find_first_not_of(".0123456789", pos + 1) != std::string::npos)
         break;
       libname.erase(pos);
     }
@@ -252,7 +239,7 @@ void RemoteClient::refresh_heap()
 {
   // Read/dereference/refresh the std_heap pointer:
   if (not this->heap)
-    this->heap = std::unique_ptr<s_xbt_mheap_t>(new s_xbt_mheap_t());
+    this->heap.reset(new s_xbt_mheap_t());
   this->read_bytes(this->heap.get(), sizeof(mdesc), remote(this->heap_address), simgrid::mc::ProcessIndexDisabled);
   this->cache_flags_ |= RemoteClient::cache_heap;
 }
@@ -415,7 +402,6 @@ std::string RemoteClient::read_string(RemotePtr<char> address) const
   if (not address)
     return {};
 
-  // TODO, use std::vector with .data() in C++17 to avoid useless copies
   std::vector<char> res(128);
   off_t off = 0;
 
@@ -441,12 +427,12 @@ std::string RemoteClient::read_string(RemotePtr<char> address) const
 }
 
 const void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr<void> address, int process_index,
-                                     ReadOptions options) const
+                                     ReadOptions /*options*/) const
 {
-  if (process_index != simgrid::mc::ProcessIndexDisabled) {
-    std::shared_ptr<simgrid::mc::ObjectInformation> const& info = this->find_object_info_rw((void*)address.address());
-// Segment overlap is not handled.
 #if HAVE_SMPI
+  if (process_index != simgrid::mc::ProcessIndexDisabled) {
+    std::shared_ptr<simgrid::mc::ObjectInformation> const& info = this->find_object_info_rw(address);
+    // Segment overlap is not handled.
     if (info.get() && this->privatized(*info)) {
       if (process_index < 0)
         xbt_die("Missing process index");
@@ -465,8 +451,8 @@ const void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr<v
       size_t offset = address.address() - (std::uint64_t)info->start_rw;
       address       = remote((char*)privatization_region.address + offset);
     }
-#endif
   }
+#endif
   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;
@@ -642,7 +628,7 @@ void RemoteClient::dumpStack()
     return;
   }
 
-  simgrid::mc::dumpStack(stderr, cursor);
+  simgrid::mc::dumpStack(stderr, std::move(cursor));
 
   _UPT_destroy(context);
   unw_destroy_addr_space(as);