- if (mc_mode == MC_MODE_CLIENT)
- 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();