- if (!process_remote_address)
- return NULL;
- if (MC_process_is_self(&mc_model_checker->process()))
- return process_remote_address;
-
- mc_smx_process_info_t process_info = MC_smx_resolve_process_info(process_remote_address);
- if (process_info)
- return &process_info->copy;
- else
- return NULL;
-}
-
-mc_smx_process_info_t MC_smx_resolve_process_info(smx_process_t process_remote_address)
-{
- if (MC_process_is_self(&mc_model_checker->process()))
- xbt_die("No process_info for local process is not enabled.");
-
- unsigned index;
- mc_smx_process_info_t process_info;
- xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, index, 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)
- if (process_info->address == process_remote_address)
- return process_info;
- xbt_die("Process info not found");
-}
-
-const char* MC_smx_process_get_host_name(smx_process_t p)
-{
- if (MC_process_is_self(&mc_model_checker->process()))
- return SIMIX_host_get_name(p->smx_host);
-
- mc_process_t process = &mc_model_checker->process();
-
- // Currently, smx_host_t = xbt_dictelm_t.
- // TODO, add an static_assert on this if switching to C++
- // The host name is host->key and the host->key_len==strlen(host->key).
- s_xbt_dictelm_t host_copy;
- mc_smx_process_info_t info = MC_smx_process_get_info(p);
- if (!info->hostname) {
-
- // Read the hostname from the MCed process:
- MC_process_read_simple(process, &host_copy, p->smx_host, sizeof(host_copy));
- int len = host_copy.key_len + 1;
- char hostname[len];
- MC_process_read_simple(process, hostname, host_copy.key, len);
- info->hostname = mc_model_checker->get_host_name(hostname);
- }
+ if (mc_model_checker == nullptr)
+ return actor->host->cname();
+
+ simgrid::mc::Process* process = &mc_model_checker->process();
+
+ /* HACK, Horrible hack to find the offset of the id in the simgrid::s4u::Host.
+
+ Offsetof is not supported for non-POD types but this should
+ work in practice for the targets currently supported by the MC
+ as long as we do not add funny features to the Host class
+ (such as virtual base).
+
+ We are using a (C++11) unrestricted union in order to avoid
+ any construction/destruction of the simgrid::s4u::Host.
+ */
+ union fake_host {
+ simgrid::s4u::Host host;
+ fake_host() {}
+ ~fake_host() {}
+ };
+ fake_host foo;
+ const size_t offset = (char*) &foo.host.name() - (char*) &foo.host;
+
+ // Read the simgrid::xbt::string in the MCed process:
+ simgrid::mc::ActorInformation* info = actor_info_cast(actor);
+ auto remote_string_address = remote((simgrid::xbt::string_data*)((char*)actor->host + offset));
+ simgrid::xbt::string_data remote_string = process->read(remote_string_address);
+ char hostname[remote_string.len];
+ process->read_bytes(hostname, remote_string.len + 1, remote(remote_string.data));
+ info->hostname = mc_model_checker->get_host_name(hostname).c_str();