#include <exception>
#include <functional>
+#include <map>
#include <string>
#include <utility>
#include <boost/range/algorithm.hpp>
-#include "xbt/dict.h"
#include "xbt/ex.hpp"
#include "xbt/functional.hpp"
#include "xbt/log.h"
ActorImpl::~ActorImpl()
{
delete this->context;
- xbt_dict_free(&this->properties);
}
static int dying_daemon(void* exit_status, void* data)
arg.auto_restart = auto_restart;
// kill the old process
- SIMIX_process_kill(this, this);
+ SIMIX_process_kill(this, (this == simix_global->maestro_process) ? this : SIMIX_process_self());
// start the new process
ActorImpl* actor = simix_global->create_process_function(arg.name.c_str(), std::move(arg.code), arg.data, arg.host,
} else {
if (not simix_global)
xbt_die("simix is not initialized, please call MSG_init first");
- maestro->context =
- simix_global->context_factory->create_maestro(code, maestro);
+ maestro->context = simix_global->context_factory->create_maestro(code, maestro);
}
maestro->simcall.issuer = maestro;
* \return the process created
*/
smx_actor_t SIMIX_process_create(const char* name, std::function<void()> code, void* data, simgrid::s4u::Host* host,
- xbt_dict_t properties, smx_actor_t parent_process)
+ std::map<std::string, std::string>* properties, smx_actor_t parent_process)
{
XBT_DEBUG("Start process %s on host '%s'", name, host->getCname());
process->context = SIMIX_context_new(std::move(code), simix_global->cleanup_process_function, process);
/* Add properties */
- process->properties = properties;
+ if (properties != nullptr)
+ for (auto kv : *properties)
+ process->setProperty(kv.first, kv.second);
/* Make sure that the process is initialized for simix, in case we are called from the Host::onCreation signal */
if (host->extension<simgrid::simix::Host>() == nullptr)
return process;
}
-smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostname, xbt_dict_t properties,
- smx_actor_t parent_process)
+smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostname,
+ std::map<std::string, std::string>* properties, smx_actor_t parent_process)
{
// This is mostly a copy/paste from SIMIX_process_new(),
// it'd be nice to share some code between those two functions.
XBT_DEBUG("Attach process %s on host '%s'", name, hostname);
if (host->isOff()) {
- XBT_WARN("Cannot launch process '%s' on failed host '%s'",
- name, hostname);
+ XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, hostname);
return nullptr;
}
XBT_VERB("Create context %s", process->name.c_str());
if (not simix_global)
xbt_die("simix is not initialized, please call MSG_init first");
- process->context = simix_global->context_factory->attach(
- simix_global->cleanup_process_function, process);
+ process->context = simix_global->context_factory->attach(simix_global->cleanup_process_function, process);
/* Add properties */
- process->properties = properties;
+ if (properties != nullptr)
+ for (auto kv : *properties)
+ process->setProperty(kv.first, kv.second);
/* Add the process to it's host process list */
xbt_swag_insert(process, host->extension<simgrid::simix::Host>()->process_list);
* The C API should first be properly replaced with the C++ one, which is a fair amount of work.
*/
intrusive_ptr_add_ref(process);
- SIMIX_process_on_exit(process, (int_f_pvoid_pvoid_t)SIMIX_process_join_finish, &*res);
+ SIMIX_process_on_exit(process,
+ [](void*, void* arg) {
+ return simgrid::simix::kernelImmediate(
+ [&] { return SIMIX_process_join_finish(SMX_EXIT_SUCCESS, arg); });
+ },
+ &*res);
return res;
}
/* Add the process to the list of process to restart, only if the host is down */
if (self->auto_restart && self->host->isOff()) {
SIMIX_host_add_auto_restart_process(self->host, self->cname(), self->code, self->userdata,
- SIMIX_timer_get_date(self->kill_timer), self->properties, self->auto_restart);
+ SIMIX_timer_get_date(self->kill_timer), self->getProperties(),
+ self->auto_restart);
}
XBT_DEBUG("Process %s@%s is dead", self->cname(), self->host->getCname());
self->context->stop();
/** @brief Returns the process from PID. */
smx_actor_t SIMIX_process_from_PID(aid_t PID)
{
- if (simix_global->process_list.find(PID) == simix_global->process_list.end())
- return nullptr;
- return simix_global->process_list.at(PID);
+ auto process = simix_global->process_list.find(PID);
+ return process == simix_global->process_list.end() ? nullptr : process->second;
}
/** @brief returns a dynar containing all currently existing processes */
* \param properties the properties of the process
* \param auto_restart either it is autorestarting or not.
*/
-extern "C"
-smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* data, sg_host_t host, int argc,
- char** argv, xbt_dict_t properties)
+extern "C" smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* data, sg_host_t host,
+ int argc, char** argv, std::map<std::string, std::string>* properties)
{
if (name == nullptr)
name = "";
}
smx_actor_t simcall_process_create(const char* name, std::function<void()> code, void* data, sg_host_t host,
- xbt_dict_t properties)
+ std::map<std::string, std::string>* properties)
{
if (name == nullptr)
name = "";