X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1712e350f8c20fb9312f5e69f1208f814d5484d1..a62b64d7cff5f86059bf7ec5df2d4f60a61a827b:/src/simix/smx_process.cpp diff --git a/src/simix/smx_process.cpp b/src/simix/smx_process.cpp index 600de45f34..2fb0858549 100644 --- a/src/simix/smx_process.cpp +++ b/src/simix/smx_process.cpp @@ -11,7 +11,7 @@ #include "xbt/dict.h" #include "mc/mc.h" #include "src/mc/mc_replay.h" -#include "src/mc/mc_client.h" +#include "src/mc/Client.hpp" #include "src/simix/smx_private.hpp" #include "src/msg/msg_private.h" @@ -103,7 +103,8 @@ void SIMIX_process_cleanup(smx_process_t process) XBT_DEBUG("%p should not be run anymore",process); xbt_swag_remove(process, simix_global->process_list); - xbt_swag_remove(process, sg_host_simix(process->host)->process_list); + if (process->host) + xbt_swag_remove(process, sg_host_simix(process->host)->process_list); xbt_swag_insert(process, simix_global->process_to_destroy); process->context->iwannadie = 0; @@ -138,25 +139,45 @@ void SIMIX_process_empty_trash(void) } } -/** - * \brief Creates and runs the maestro process - */ -void SIMIX_create_maestro_process() +namespace simgrid { +namespace simix { + +void create_maestro(std::function code) { smx_process_t maestro = NULL; - /* Create maestro process and intilialize it */ maestro = xbt_new0(s_smx_process_t, 1); maestro->pid = simix_process_maxpid++; maestro->ppid = -1; - maestro->name = (char *) ""; + maestro->name = (char*) ""; + maestro->data = nullptr; maestro->running_ctx = (xbt_running_ctx_t*) xbt_malloc0(sizeof(xbt_running_ctx_t)); XBT_RUNNING_CTX_INITIALIZE(maestro->running_ctx); - maestro->context = SIMIX_context_new(NULL, 0, NULL, NULL, maestro); + + if (!code) { + maestro->context = SIMIX_context_new(NULL, 0, nullptr, NULL, maestro); + } else { + if (!simix_global) + xbt_die("simix is not initialized, please call MSG_init first"); + maestro->context = + simix_global->context_factory->create_maestro(code, maestro); + } + maestro->simcall.issuer = maestro; simix_global->maestro_process = maestro; - return; } + +} +} + +/** + * \brief Creates and runs the maestro process + */ +void SIMIX_maestro_create(void (*code)(void*), void* data) +{ + simgrid::simix::create_maestro(std::bind(code, data)); +} + /** * \brief Stops a process. * @@ -168,7 +189,7 @@ void SIMIX_process_stop(smx_process_t arg) { /* execute the on_exit functions */ SIMIX_process_on_exit_runall(arg); /* Add the process to the list of process to restart, only if the host is down */ - if (arg->auto_restart && arg->host->is_off()) { + if (arg->auto_restart && arg->host->isOff()) { SIMIX_host_add_auto_restart_process(arg->host,arg->name,arg->code, arg->data, sg_host_get_name(arg->host), SIMIX_timer_get_date(arg->kill_timer), @@ -247,7 +268,7 @@ smx_process_t SIMIX_process_create( XBT_DEBUG("Start process %s on host '%s'", name, hostname); - if (host->is_off()) { + if (host->isOff()) { int i; XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, hostname); @@ -273,7 +294,7 @@ smx_process_t SIMIX_process_create( process->ppid = SIMIX_process_get_PID(parent_process); /* SMPI process have their own data segment and each other inherit from their father */ -#ifdef HAVE_SMPI +#if HAVE_SMPI if(smpi_privatize_global_variables){ if( parent_process->pid != 0){ SIMIX_segment_index_set(process, parent_process->segment_index); @@ -328,6 +349,110 @@ smx_process_t SIMIX_process_create( return process; } +smx_process_t SIMIX_process_attach( + const char* name, + void *data, + const char* hostname, + xbt_dict_t properties, + smx_process_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. + + sg_host_t host = sg_host_by_name(hostname); + 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); + return nullptr; + } + + smx_process_t process = xbt_new0(s_smx_process_t, 1); + /* Process data */ + process->pid = simix_process_maxpid++; + process->name = xbt_strdup(name); + process->host = host; + process->data = data; + process->comms = xbt_fifo_new(); + process->simcall.issuer = process; + process->ppid = -1; + /* Initiliaze data segment to default value */ + SIMIX_segment_index_set(process, -1); + if (parent_process != NULL) { + process->ppid = SIMIX_process_get_PID(parent_process); + /* SMPI process have their own data segment and + each other inherit from their father */ + #if HAVE_SMPI + if(smpi_privatize_global_variables){ + if(parent_process->pid != 0){ + SIMIX_segment_index_set(process, parent_process->segment_index); + } else { + SIMIX_segment_index_set(process, process->pid - 1); + } + } + #endif + } + + /* Process data for auto-restart */ + process->auto_restart = false; + process->code = nullptr; + process->argc = 0; + process->argv = nullptr; + + XBT_VERB("Create context %s", process->name); + if (!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->running_ctx = (xbt_running_ctx_t*) xbt_malloc0(sizeof(xbt_running_ctx_t)); + XBT_RUNNING_CTX_INITIALIZE(process->running_ctx); + + if(MC_is_active()){ + MC_ignore_heap(process->running_ctx, sizeof(*process->running_ctx)); + } + + /* Add properties */ + process->properties = properties; + + /* Add the process to it's host process list */ + xbt_swag_insert(process, sg_host_simix(host)->process_list); + + /* Now insert it in the global process list and in the process to run list */ + xbt_swag_insert(process, simix_global->process_list); + XBT_DEBUG("Inserting %s(%s) in the to_run list", process->name, sg_host_get_name(host)); + xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process); + + /* Tracing the process creation */ + TRACE_msg_process_create(process->name, process->pid, process->host); + + auto context = dynamic_cast(process->context); + if (!context) + xbt_die("Not a suitable context"); + + context->attach_start(); + return process; +} + +void SIMIX_process_detach(void) +{ + auto context = dynamic_cast(SIMIX_context_self()); + if (!context) + xbt_die("Not a suitable context"); + + simix_global->cleanup_process_function(context->process()); + + // Let maestro ignore we are still alive: + // xbt_swag_remove(context->process(), simix_global->process_list); + + // TODDO, Remove from proces list: + // xbt_swag_remove(process, sg_host_simix(host)->process_list); + + context->attach_stop(); + // delete context; +} + /** * \brief Executes the processes from simix_global->process_to_run. * @@ -375,7 +500,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { case SIMIX_SYNC_EXECUTE: case SIMIX_SYNC_PARALLEL_EXECUTE: - SIMIX_process_execution_destroy(process->waiting_synchro); + SIMIX_execution_destroy(process->waiting_synchro); break; case SIMIX_SYNC_COMMUNICATE: @@ -432,7 +557,7 @@ void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, con case SIMIX_SYNC_EXECUTE: case SIMIX_SYNC_PARALLEL_EXECUTE: - SIMIX_process_execution_cancel(process->waiting_synchro); + SIMIX_execution_cancel(process->waiting_synchro); break; case SIMIX_SYNC_COMMUNICATE: @@ -512,7 +637,7 @@ void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_process_t proces } else { xbt_fifo_push(sync_suspend->simcalls, simcall); process->waiting_synchro = sync_suspend; - SIMIX_host_execution_suspend(process->waiting_synchro); + SIMIX_execution_suspend(process->waiting_synchro); } /* If we are suspending ourselves, then just do not finish the simcall now */ } @@ -538,7 +663,7 @@ smx_synchro_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer) case SIMIX_SYNC_EXECUTE: case SIMIX_SYNC_PARALLEL_EXECUTE: - SIMIX_host_execution_suspend(process->waiting_synchro); + SIMIX_execution_suspend(process->waiting_synchro); break; case SIMIX_SYNC_COMMUNICATE: @@ -564,7 +689,7 @@ smx_synchro_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer) } } else { /* FIXME: computation size is zero. Is it okay that bound is zero ? */ - return SIMIX_process_execute(process, "suspend", 0.0, 1.0, 0.0, 0); + return SIMIX_execution_start(process, "suspend", 0.0, 1.0, 0.0, 0); } } @@ -594,7 +719,7 @@ void SIMIX_process_resume(smx_process_t process, smx_process_t issuer) case SIMIX_SYNC_EXECUTE: case SIMIX_SYNC_PARALLEL_EXECUTE: - SIMIX_host_execution_resume(process->waiting_synchro); + SIMIX_execution_resume(process->waiting_synchro); break; case SIMIX_SYNC_COMMUNICATE: @@ -643,9 +768,9 @@ int SIMIX_process_get_PPID(smx_process_t self){ return self->ppid; } -void* SIMIX_process_self_get_data(smx_process_t self) +void* SIMIX_process_self_get_data() { - xbt_assert(self == SIMIX_process_self(), "This is not the current process"); + smx_process_t self = SIMIX_process_self(); if (!self) { return NULL; @@ -653,9 +778,9 @@ void* SIMIX_process_self_get_data(smx_process_t self) return SIMIX_process_get_data(self); } -void SIMIX_process_self_set_data(smx_process_t self, void *data) +void SIMIX_process_self_set_data(void *data) { - xbt_assert(self == SIMIX_process_self(), "This is not the current process"); + smx_process_t self = SIMIX_process_self(); SIMIX_process_set_data(self, data); } @@ -685,7 +810,7 @@ const char* SIMIX_process_self_get_name(void) { smx_process_t process = SIMIX_process_self(); if (process == NULL || process == simix_global->maestro_process) - return ""; + return "maestro"; return SIMIX_process_get_name(process); } @@ -773,7 +898,7 @@ smx_synchro_t SIMIX_process_sleep(smx_process_t process, double duration) sg_host_t host = process->host; /* check if the host is active */ - if (host->is_off()) { + if (host->isOff()) { THROWF(host_error, 0, "Host %s failed, you cannot call this function", sg_host_get_name(host)); } @@ -801,13 +926,13 @@ void SIMIX_post_process_sleep(smx_synchro_t synchro) while ((simcall = (smx_simcall_t) xbt_fifo_shift(synchro->simcalls))) { switch (synchro->sleep.surf_sleep->getState()){ - case SURF_ACTION_FAILED: + case simgrid::surf::Action::State::failed: simcall->issuer->context->iwannadie = 1; //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); state = SIMIX_SRC_HOST_FAILURE; break; - case SURF_ACTION_DONE: + case simgrid::surf::Action::State::done: state = SIMIX_DONE; break; @@ -815,7 +940,7 @@ void SIMIX_post_process_sleep(smx_synchro_t synchro) THROW_IMPOSSIBLE; break; } - if (simcall->issuer->host->is_off()) { + if (simcall->issuer->host->isOff()) { simcall->issuer->context->iwannadie = 1; } simcall_process_sleep__set__result(simcall, state); @@ -896,7 +1021,7 @@ void SIMIX_process_yield(smx_process_t self) if (self->doexception) { XBT_DEBUG("Wait, maestro left me an exception"); self->doexception = 0; - SMX_THROW(); + RETHROW; } if(SMPI_switch_data_segment && self->segment_index != -1){ @@ -907,7 +1032,11 @@ void SIMIX_process_yield(smx_process_t self) /* callback: context fetching */ xbt_running_ctx_t *SIMIX_process_get_running_context(void) { - return SIMIX_process_self()->running_ctx; + smx_process_t process = SIMIX_process_self(); + if (process) + return process->running_ctx; + else + return nullptr; } /* callback: termination */