and use std::vector<> for storing it instead of xbt_dynar
remote(std_heap_var->address),
simgrid::mc::ProcessIndexDisabled);
remote(std_heap_var->address),
simgrid::mc::ProcessIndexDisabled);
- this->smx_process_infos = MC_smx_process_info_list_new();
- this->smx_old_process_infos = MC_smx_process_info_list_new();
+ this->smx_process_infos.clear();
+ this->smx_old_process_infos.clear();
this->unw_addr_space = unw_create_addr_space(&mc_unw_accessors , __BYTE_ORDER);
this->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER);
this->unw_underlying_context = _UPT_create(this->pid_);
this->unw_addr_space = unw_create_addr_space(&mc_unw_accessors , __BYTE_ORDER);
this->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER);
this->unw_underlying_context = _UPT_create(this->pid_);
this->maestro_stack_start_ = nullptr;
this->maestro_stack_end_ = nullptr;
this->maestro_stack_start_ = nullptr;
this->maestro_stack_end_ = nullptr;
- xbt_dynar_free(&this->smx_process_infos);
- xbt_dynar_free(&this->smx_old_process_infos);
-
if (this->memory_file >= 0) {
close(this->memory_file);
}
if (this->memory_file >= 0) {
close(this->memory_file);
}
{
xbt_assert(mc_mode != MC_MODE_CLIENT);
MC_process_smx_refresh(&mc_model_checker->process());
{
xbt_assert(mc_mode != MC_MODE_CLIENT);
MC_process_smx_refresh(&mc_model_checker->process());
- return simgrid::xbt::range<s_mc_smx_process_info>(smx_process_infos);
+ return boost::iterator_range<s_mc_smx_process_info*>(
+ &*smx_process_infos.begin(),
+ &*smx_process_infos.end());
};
/** Hostname (owned by `mc_modelchecker->hostnames`) */
const char* hostname = nullptr;
};
/** Hostname (owned by `mc_modelchecker->hostnames`) */
const char* hostname = nullptr;
+ std::string name;
+
+ void clear()
+ {
+ name.clear();
+ address = nullptr;
+ hostname = nullptr;
+ }
};
struct IgnoredRegion {
};
struct IgnoredRegion {
- xbt_dynar_t smx_process_infos = nullptr;
+ std::vector<SimixProcessInformation> smx_process_infos;
/** Copy of `simix_global->process_to_destroy`
*
* See mc_smx.c.
*/
/** Copy of `simix_global->process_to_destroy`
*
* See mc_smx.c.
*/
- xbt_dynar_t smx_old_process_infos = nullptr;
+ std::vector<SimixProcessInformation> smx_old_process_infos;
/** State of the cache (which variables are up to date) */
mc_process_cache_flags_t cache_flags = MC_PROCESS_CACHE_FLAG_NONE;
/** State of the cache (which variables are up to date) */
mc_process_cache_flags_t cache_flags = MC_PROCESS_CACHE_FLAG_NONE;
void* unw_underlying_context;
};
void* unw_underlying_context;
};
+// TODO, remove this
+#define MC_PROCESS_FOREACH(xs, cursor, p) \
+ if (! xs.empty()) \
+ for (auto __it = (cursor = 0, p = &*xs.begin(), xs.begin()); \
+ __it != xs.end(); ++__it, ++cursor, p = &*__it)
+
/** Open a FD to a remote process memory (`/dev/$pid/mem`)
*/
XBT_PRIVATE int open_vm(pid_t pid, int flags);
/** Open a FD to a remote process memory (`/dev/$pid/mem`)
*/
XBT_PRIVATE int open_vm(pid_t pid, int flags);
unsigned i;
mc_smx_process_info_t pi = nullptr;
unsigned i;
mc_smx_process_info_t pi = nullptr;
- xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, i, pi) {
+ MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, i, pi) {
if (req == &pi->copy.simcall) {
mc_model_checker->simcall_handle(
mc_model_checker->process(), pi->copy.pid, value);
if (req == &pi->copy.simcall) {
mc_model_checker->simcall_handle(
mc_model_checker->process(), pi->copy.pid, value);
-static
-void MC_smx_process_info_clear(mc_smx_process_info_t p)
-{
- p->hostname = nullptr;
- std::free(p->name);
- p->name = nullptr;
-}
-
-xbt_dynar_t MC_smx_process_info_list_new(void)
-{
- return xbt_dynar_new(
- sizeof(s_mc_smx_process_info_t),
- ( void_f_pvoid_t) &MC_smx_process_info_clear);
-}
-
-bool is_in_dynar(smx_process_t p, xbt_dynar_t dynar)
+bool is_in_vector(smx_process_t p, std::vector<simgrid::mc::SimixProcessInformation>& ps)
- return (uintptr_t) p >= (uintptr_t) dynar->data
- && (uintptr_t) p < ((uintptr_t) dynar->data + dynar->used * dynar->elmsize);
+ return (uintptr_t) p >= (uintptr_t) &ps[0]
+ && (uintptr_t) p < (uintptr_t) &ps[ps.size()];
}
static inline
mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p)
{
}
static inline
mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p)
{
- assert(is_in_dynar(p, mc_model_checker->process().smx_process_infos)
- || is_in_dynar(p, mc_model_checker->process().smx_old_process_infos));
+ assert(is_in_vector(p, mc_model_checker->process().smx_process_infos)
+ || is_in_vector(p, mc_model_checker->process().smx_old_process_infos));
mc_smx_process_info_t process_info =
(mc_smx_process_info_t)
((char*) p - offsetof(s_mc_smx_process_info_t, copy));
mc_smx_process_info_t process_info =
(mc_smx_process_info_t)
((char*) p - offsetof(s_mc_smx_process_info_t, copy));
*/
static void MC_process_refresh_simix_process_list(
simgrid::mc::Process* process,
*/
static void MC_process_refresh_simix_process_list(
simgrid::mc::Process* process,
- xbt_dynar_t target, xbt_swag_t remote_swag)
+ std::vector<simgrid::mc::SimixProcessInformation>& target, xbt_swag_t remote_swag)
// swag = REMOTE(*simix_global->process_list)
s_xbt_swag_t swag;
process->read_bytes(&swag, sizeof(swag), remote(remote_swag));
// swag = REMOTE(*simix_global->process_list)
s_xbt_swag_t swag;
process->read_bytes(&swag, sizeof(swag), remote(remote_swag));
- smx_process_t p;
- xbt_dynar_reset(target);
-
// Load each element of the dynar from the MCed process:
int i = 0;
// Load each element of the dynar from the MCed process:
int i = 0;
- for (p = (smx_process_t) swag.head; p; ++i) {
+ for (smx_process_t p = (smx_process_t) swag.head; p; ++i) {
- s_mc_smx_process_info_t info;
+ simgrid::mc::SimixProcessInformation info;
info.hostname = nullptr;
process->read_bytes(&info.copy, sizeof(info.copy), remote(p));
info.hostname = nullptr;
process->read_bytes(&info.copy, sizeof(info.copy), remote(p));
- xbt_dynar_push(target, &info);
+ target.push_back(std::move(info));
// Lookup next process address:
p = (smx_process_t) xbt_swag_getNext(&info.copy, swag.offset);
// Lookup next process address:
p = (smx_process_t) xbt_swag_getNext(&info.copy, swag.offset);
mc_smx_process_info_t p;
// Lookup by address:
mc_smx_process_info_t p;
// Lookup by address:
- xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, i, p)
+ MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, i, p)
if (p->address == address)
return &p->copy;
if (p->address == address)
return &p->copy;
- xbt_dynar_foreach_ptr(mc_model_checker->process().smx_old_process_infos, i, p)
+ MC_PROCESS_FOREACH(mc_model_checker->process().smx_old_process_infos, i, p)
if (p->address == address)
return &p->copy;
if (p->address == address)
return &p->copy;
unsigned index;
mc_smx_process_info_t process_info;
unsigned index;
mc_smx_process_info_t process_info;
- xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, index, process_info)
+ MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, index, process_info)
if (process_info->address == process_remote_address)
return process_info;
if (process_info->address == process_remote_address)
return process_info;
- xbt_dynar_foreach_ptr(mc_model_checker->process().smx_old_process_infos, index, process_info)
+ MC_PROCESS_FOREACH(mc_model_checker->process().smx_old_process_infos, index, process_info)
if (process_info->address == process_remote_address)
return process_info;
xbt_die("Process info not found");
if (process_info->address == process_remote_address)
return process_info;
xbt_die("Process info not found");
return nullptr;
mc_smx_process_info_t info = MC_smx_process_get_info(p);
return nullptr;
mc_smx_process_info_t info = MC_smx_process_get_info(p);
- if (!info->name) {
- info->name = process->read_string(p->name);
+ if (info->name.empty()) {
+ char* name = process->read_string(p->name);
+ info->name = name;
+ free(name);
+ return info->name.c_str();
typedef s_mc_smx_process_info s_mc_smx_process_info_t, *mc_smx_process_info_t;
typedef s_mc_smx_process_info s_mc_smx_process_info_t, *mc_smx_process_info_t;
-XBT_PRIVATE xbt_dynar_t MC_smx_process_info_list_new(void);
-
XBT_PRIVATE void MC_process_smx_refresh(simgrid::mc::Process* process);
/** Get the issuer of a simcall (`req->issuer`)
XBT_PRIVATE void MC_process_smx_refresh(simgrid::mc::Process* process);
/** Get the issuer of a simcall (`req->issuer`)
process->get_malloc_info());
MC_process_smx_refresh(&mc_model_checker->process());
process->get_malloc_info());
MC_process_smx_refresh(&mc_model_checker->process());
- new_state->nb_processes = xbt_dynar_length(
- mc_model_checker->process().smx_process_infos);
+ new_state->nb_processes =
+ mc_model_checker->process().smx_process_infos.size();
new_state->system_state = simgrid::mc::take_snapshot(mc_stats->expanded_states);
new_state->num = mc_stats->expanded_states;
new_state->system_state = simgrid::mc::take_snapshot(mc_stats->expanded_states);
new_state->num = mc_stats->expanded_states;
process->get_malloc_info());
MC_process_smx_refresh(&mc_model_checker->process());
process->get_malloc_info());
MC_process_smx_refresh(&mc_model_checker->process());
- pair->nb_processes = xbt_dynar_length(
- mc_model_checker->process().smx_process_infos);
+ pair->nb_processes =
+ mc_model_checker->process().smx_process_infos.size();
pair->automaton_state = automaton_state;
pair->num = pair_num;
pair->automaton_state = automaton_state;
pair->num = pair_num;