X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ce81107755533b85687d863b44b9163108ee6c66..81e2987ceb9329c50f0ac8109504aa5c784071e2:/src/mc/Process.cpp diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index 67a18b3b95..b001926912 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -34,10 +34,10 @@ #include "mc_smx.h" #include "mc_server.h" -#include "mc/Process.hpp" -#include "mc/AddressSpace.hpp" -#include "mc/ObjectInformation.hpp" -#include "mc/Variable.hpp" +#include "src/mc/Process.hpp" +#include "src/mc/AddressSpace.hpp" +#include "src/mc/ObjectInformation.hpp" +#include "src/mc/Variable.hpp" using simgrid::mc::remote; @@ -67,6 +67,7 @@ static const char *const FILTERED_LIBS[] = { "libelf", "libgcc_s", "liblua5.1", + "liblua5.3", "liblzma", "libm", "libpthread", @@ -206,34 +207,23 @@ int open_vm(pid_t pid, int flags) namespace simgrid { namespace mc { -Process::Process(pid_t pid, int sockfd) +Process::Process(pid_t pid, int sockfd) : AddressSpace(this) { Process* process = this; - - process->process_flags = MC_PROCESS_NO_FLAG; process->socket_ = sockfd; process->pid_ = pid; - if (pid==getpid()) - process->process_flags |= MC_PROCESS_SELF_FLAG; process->running_ = true; process->status_ = 0; - process->memory_map_ = get_memory_map(pid); + process->memory_map_ = simgrid::xbt::get_memory_map(pid); process->cache_flags = MC_PROCESS_CACHE_FLAG_NONE; - process->heap = NULL; - process->heap_info = NULL; process->init_memory_map_info(); process->clear_refs_fd_ = -1; process->pagemap_fd_ = -1; - // Open the memory file - if (process->is_self()) - process->memory_file = -1; - else { - int fd = open_vm(process->pid_, O_RDWR); - if (fd<0) - xbt_die("Could not open file for process virtual address space"); - process->memory_file = fd; - } + int fd = open_vm(process->pid_, O_RDWR); + if (fd<0) + xbt_die("Could not open file for process virtual address space"); + process->memory_file = fd; // Read std_heap (is a struct mdesc*): simgrid::mc::Variable* std_heap_var = process->find_variable("__mmalloc_default_mdp"); @@ -247,15 +237,9 @@ Process::Process(pid_t pid, int sockfd) process->smx_process_infos = MC_smx_process_info_list_new(); process->smx_old_process_infos = MC_smx_process_info_list_new(); - process->unw_addr_space = unw_create_addr_space(&mc_unw_accessors , __BYTE_ORDER); - if (process->process_flags & MC_PROCESS_SELF_FLAG) { - process->unw_underlying_addr_space = unw_local_addr_space; - process->unw_underlying_context = NULL; - } else { - process->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER); - process->unw_underlying_context = _UPT_create(pid); - } + process->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER); + process->unw_underlying_context = _UPT_create(pid); } Process::~Process() @@ -265,7 +249,6 @@ Process::~Process() if (this->socket_ >= 0 && close(this->socket_) < 0) xbt_die("Could not close communication socket"); - process->process_flags = MC_PROCESS_NO_FLAG; process->pid_ = 0; process->maestro_stack_start_ = nullptr; @@ -290,12 +273,6 @@ Process::~Process() process->cache_flags = MC_PROCESS_CACHE_FLAG_NONE; - free(process->heap); - process->heap = NULL; - - free(process->heap_info); - process->heap_info = NULL; - if (process->clear_refs_fd_ >= 0) close(process->clear_refs_fd_); if (process->pagemap_fd_ >= 0) @@ -310,13 +287,11 @@ Process::~Process() void Process::refresh_heap() { xbt_assert(mc_mode == MC_MODE_SERVER); - xbt_assert(!this->is_self()); // Read/dereference/refresh the std_heap pointer: - if (!this->heap) { - this->heap = (struct mdesc*) malloc(sizeof(struct mdesc)); - } - this->read_bytes(this->heap, sizeof(struct mdesc), remote(this->heap_address), - simgrid::mc::ProcessIndexDisabled); + if (!this->heap) + this->heap = std::unique_ptr(new s_xbt_mheap_t()); + this->read_bytes(this->heap.get(), sizeof(struct mdesc), + remote(this->heap_address), simgrid::mc::ProcessIndexDisabled); this->cache_flags |= MC_PROCESS_CACHE_FLAG_HEAP; } @@ -328,14 +303,13 @@ void Process::refresh_heap() void Process::refresh_malloc_info() { xbt_assert(mc_mode == MC_MODE_SERVER); - xbt_assert(!this->is_self()); if (!(this->cache_flags & MC_PROCESS_CACHE_FLAG_HEAP)) this->refresh_heap(); // Refresh process->heapinfo: - size_t malloc_info_bytesize = - (this->heap->heaplimit + 1) * sizeof(malloc_info); - this->heap_info = (malloc_info*) realloc(this->heap_info, malloc_info_bytesize); - this->read_bytes(this->heap_info, malloc_info_bytesize, + size_t count = this->heap->heaplimit + 1; + if (this->heap_info.size() < count) + this->heap_info.resize(count); + this->read_bytes(this->heap_info.data(), count * sizeof(malloc_info), remote(this->heap->heapinfo), simgrid::mc::ProcessIndexDisabled); this->cache_flags |= MC_PROCESS_CACHE_FLAG_MALLOC_INFO; } @@ -355,14 +329,14 @@ void Process::init_memory_map_info() if(regcomp(&res.so_re, SO_RE, 0) || regcomp(&res.version_re, VERSION_RE, 0)) xbt_die(".so regexp did not compile"); - std::vector const& maps = this->memory_map_; + std::vector const& maps = this->memory_map_; const char* current_name = NULL; this->object_infos.resize(0); for (size_t i=0; i < maps.size(); i++) { - simgrid::mc::VmMap const& reg = maps[i]; + simgrid::xbt::VmMap const& reg = maps[i]; const char* pathname = maps[i].pathname.c_str(); // Nothing to do @@ -401,7 +375,7 @@ void Process::init_memory_map_info() } std::shared_ptr info = - MC_find_object_info(this->memory_map_, pathname, is_executable); + MC_find_object_info(this->memory_map_, pathname); this->object_infos.push_back(info); if (is_executable) this->binary_info = info; @@ -503,8 +477,6 @@ char* Process::read_string(remote_ptr address) const { if (!address) return NULL; - if (this->is_self()) - return xbt_strdup((char*) address.address()); off_t len = 128; char* res = (char*) malloc(len); @@ -564,18 +536,9 @@ const void *Process::read_bytes(void* buffer, std::size_t size, #endif } - if (this->is_self()) { - if (mode == simgrid::mc::AddressSpace::Lazy) - return (void*)address.address(); - else { - memcpy(buffer, (void*)address.address(), size); - return buffer; - } - } else { - if (pread_whole(this->memory_file, buffer, size, address.address()) < 0) - xbt_die("Read from process %lli failed", (long long) this->pid_); - return buffer; - } + if (pread_whole(this->memory_file, buffer, size, address.address()) < 0) + xbt_die("Read from process %lli failed", (long long) this->pid_); + return buffer; } /** Write data to a process memory @@ -587,26 +550,18 @@ const void *Process::read_bytes(void* buffer, std::size_t size, */ void Process::write_bytes(const void* buffer, size_t len, remote_ptr address) { - if (this->is_self()) { - memcpy((void*)address.address(), buffer, len); - } else { - if (pwrite_whole(this->memory_file, buffer, len, address.address()) < 0) - xbt_die("Write to process %lli failed", (long long) this->pid_); - } + if (pwrite_whole(this->memory_file, buffer, len, address.address()) < 0) + xbt_die("Write to process %lli failed", (long long) this->pid_); } void Process::clear_bytes(remote_ptr address, size_t len) { - if (this->is_self()) { - memset((void*)address.address(), 0, len); - } else { - pthread_once(&zero_buffer_flag, MC_zero_buffer_init); - while (len) { - size_t s = len > zero_buffer_size ? zero_buffer_size : len; - this->write_bytes(zero_buffer, s, address); - address = remote((char*) address.address() + s); - len -= s; - } + pthread_once(&zero_buffer_flag, MC_zero_buffer_init); + while (len) { + size_t s = len > zero_buffer_size ? zero_buffer_size : len; + this->write_bytes(zero_buffer, s, address); + address = remote((char*) address.address() + s); + len -= s; } }