summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
113b02e)
This was needed for single-process mode.
Process::Process(pid_t pid, int sockfd)
{
Process* process = this;
Process::Process(pid_t pid, int sockfd)
{
Process* process = this;
-
- process->process_flags = MC_PROCESS_NO_FLAG;
process->socket_ = sockfd;
process->pid_ = pid;
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->running_ = true;
process->status_ = 0;
process->memory_map_ = get_memory_map(pid);
process->clear_refs_fd_ = -1;
process->pagemap_fd_ = -1;
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");
// Read std_heap (is a struct mdesc*):
simgrid::mc::Variable* std_heap_var = process->find_variable("__mmalloc_default_mdp");
process->smx_process_infos = MC_smx_process_info_list_new();
process->smx_old_process_infos = MC_smx_process_info_list_new();
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);
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);
if (this->socket_ >= 0 && close(this->socket_) < 0)
xbt_die("Could not close communication socket");
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;
process->pid_ = 0;
process->maestro_stack_start_ = nullptr;
void Process::refresh_heap()
{
xbt_assert(mc_mode == MC_MODE_SERVER);
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));
// Read/dereference/refresh the std_heap pointer:
if (!this->heap) {
this->heap = (struct mdesc*) malloc(sizeof(struct mdesc));
void Process::refresh_malloc_info()
{
xbt_assert(mc_mode == MC_MODE_SERVER);
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:
if (!(this->cache_flags & MC_PROCESS_CACHE_FLAG_HEAP))
this->refresh_heap();
// Refresh process->heapinfo:
{
if (!address)
return NULL;
{
if (!address)
return NULL;
- if (this->is_self())
- return xbt_strdup((char*) address.address());
off_t len = 128;
char* res = (char*) malloc(len);
off_t len = 128;
char* res = (char*) malloc(len);
- 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
}
/** Write data to a process memory
*/
void Process::write_bytes(const void* buffer, size_t len, remote_ptr<void> address)
{
*/
void Process::write_bytes(const void* buffer, size_t len, remote_ptr<void> 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<void> address, size_t len)
{
}
void Process::clear_bytes(remote_ptr<void> 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;
#include "AddressSpace.hpp"
#include "mc_protocol.h"
#include "AddressSpace.hpp"
#include "mc_protocol.h"
-typedef int mc_process_flags_t;
-#define MC_PROCESS_NO_FLAG 0
-#define MC_PROCESS_SELF_FLAG 1
-
// Those flags are used to track down which cached information
// is still up to date and which information needs to be updated.
typedef int mc_process_cache_flags_t;
// Those flags are used to track down which cached information
// is still up to date and which information needs to be updated.
typedef int mc_process_cache_flags_t;
Process(pid_t pid, int sockfd);
~Process();
Process(pid_t pid, int sockfd);
~Process();
-
- bool is_self() const
- {
- return this->process_flags & MC_PROCESS_SELF_FLAG;
- }
-
// Read memory:
const void* read_bytes(void* buffer, std::size_t size,
remote_ptr<void> address, int process_index = ProcessIndexAny,
// Read memory:
const void* read_bytes(void* buffer, std::size_t size,
remote_ptr<void> address, int process_index = ProcessIndexAny,
void refresh_heap();
void refresh_malloc_info();
private:
void refresh_heap();
void refresh_malloc_info();
private:
- mc_process_flags_t process_flags;
pid_t pid_;
int socket_;
int status_;
pid_t pid_;
int socket_;
int status_;
void MC_process_smx_refresh(simgrid::mc::Process* process)
{
xbt_assert(mc_mode == MC_MODE_SERVER);
void MC_process_smx_refresh(simgrid::mc::Process* process)
{
xbt_assert(mc_mode == MC_MODE_SERVER);
- xbt_assert(!process->is_self());
if (process->cache_flags & MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES)
return;
if (process->cache_flags & MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES)
return;
{
if (!context->process || !context->address_space)
return -UNW_EUNSPEC;
{
if (!context->process || !context->address_space)
return -UNW_EUNSPEC;
- simgrid::mc::AddressSpace* as = context->address_space;
-
- simgrid::mc::Process* process = dynamic_cast<simgrid::mc::Process*>(as);
- if (process && process->is_self())
- return unw_init_local(cursor, &context->context);
-
return unw_init_remote(cursor, context->process->unw_addr_space, context);
}
return unw_init_remote(cursor, context->process->unw_addr_space, context);
}
process->get_heap()->heaplimit,
process->get_malloc_info());
process->get_heap()->heaplimit,
process->get_malloc_info());
- if (mc_model_checker->process().is_self()) {
- new_state->nb_processes = xbt_swag_size(simix_global->process_list);
- } else {
- MC_process_smx_refresh(&mc_model_checker->process());
- new_state->nb_processes = xbt_dynar_length(
- mc_model_checker->process().smx_process_infos);
- }
+ MC_process_smx_refresh(&mc_model_checker->process());
+ new_state->nb_processes = xbt_dynar_length(
+ mc_model_checker->process().smx_process_infos);
new_state->system_state = MC_take_snapshot(mc_stats->expanded_states);
new_state->num = mc_stats->expanded_states;
new_state->system_state = MC_take_snapshot(mc_stats->expanded_states);
new_state->num = mc_stats->expanded_states;
pair->heap_bytes_used = mmalloc_get_bytes_used_remote(
process->get_heap()->heaplimit,
process->get_malloc_info());
pair->heap_bytes_used = mmalloc_get_bytes_used_remote(
process->get_heap()->heaplimit,
process->get_malloc_info());
- if (mc_model_checker->process().is_self()) {
- pair->nb_processes = xbt_swag_size(simix_global->process_list);
- } else {
- MC_process_smx_refresh(&mc_model_checker->process());
- pair->nb_processes = xbt_dynar_length(
- mc_model_checker->process().smx_process_infos);
- }
+
+ MC_process_smx_refresh(&mc_model_checker->process());
+ pair->nb_processes = xbt_dynar_length(
+ mc_model_checker->process().smx_process_infos);
+
pair->automaton_state = automaton_state;
pair->num = pair_num;
pair->other_num = -1;
pair->automaton_state = automaton_state;
pair->num = pair_num;
pair->other_num = -1;