X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f5acac9da28f84a6625be7afaa01fc4ec6c643e7..d1f1e22acb2e2342b535c3847e804b4a5fee3167:/src/simix/libsmx.cpp diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index e052a98fdb..794909f9e5 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -15,13 +15,16 @@ #include +#include + #include "src/mc/mc_replay.h" #include "smx_private.h" #include "src/mc/mc_forward.hpp" #include "xbt/ex.h" #include "mc/mc.h" #include "src/simix/smx_host_private.h" -#include "src/simix/smx_private.hpp" + +#include "src/simix/SynchroComm.hpp" #include @@ -32,7 +35,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); void simcall_call(smx_process_t process) { if (process != simix_global->maestro_process) { - XBT_DEBUG("Yield process '%s' on simcall %s (%d)", process->name, + XBT_DEBUG("Yield process '%s' on simcall %s (%d)", process->name.c_str(), SIMIX_simcall_name(process->simcall.call), (int)process->simcall.call); SIMIX_process_yield(process); } else { @@ -124,18 +127,6 @@ smx_synchro_t simcall_execution_parallel_start(const char *name, } -/** - * \ingroup simix_process_management - * \brief Destroys an execution synchro. - * - * Destroys a synchro, freeing its memory. This function cannot be called if there are a conditional waiting for it. - * \param execution The execution synchro to destroy - */ -void simcall_execution_destroy(smx_synchro_t execution) -{ - simcall_BODY_execution_destroy(execution); -} - /** * \ingroup simix_process_management * \brief Cancels an execution synchro. @@ -148,30 +139,6 @@ void simcall_execution_cancel(smx_synchro_t execution) simcall_BODY_execution_cancel(execution); } -/** - * \ingroup simix_process_management - * \brief Returns how much of an execution synchro remains to be done. - * - * \param execution The execution synchro - * \return The remaining amount - */ -double simcall_execution_get_remains(smx_synchro_t execution) -{ - return simcall_BODY_execution_get_remains(execution); -} - -/** - * \ingroup simix_process_management - * \brief Returns the state of an execution synchro. - * - * \param execution The execution synchro - * \return The state - */ -e_smx_state_t simcall_execution_get_state(smx_synchro_t execution) -{ - return simcall_BODY_execution_get_state(execution); -} - /** * \ingroup simix_process_management * \brief Changes the priority of an execution synchro. @@ -410,9 +377,16 @@ smx_process_t simcall_process_create(const char *name, xbt_dict_t properties, int auto_restart) { - return (smx_process_t) simcall_BODY_process_create(name, code, data, hostname, - kill_time, argc, argv, properties, - auto_restart); + if (name == nullptr) + name = ""; + auto wrapped_code = simgrid::xbt::wrapMain(code, argc, argv); + for (int i = 0; i != argc; ++i) + xbt_free(argv[i]); + xbt_free(argv); + smx_process_t res = simcall_process_create(name, + std::move(wrapped_code), + data, hostname, kill_time, properties, auto_restart); + return res; } /** @@ -553,13 +527,6 @@ void simcall_process_set_data(smx_process_t process, void *data) simgrid::simix::kernel(std::bind(SIMIX_process_set_data, process, data)); } -static void kill_process_from_timer(void* arg) -{ - smx_process_t process = (smx_process_t) arg; - simix_global->kill_process_function(process); - process->kill_timer=NULL; -} - /** * \ingroup simix_process_management * \brief Set the kill time of a process. @@ -567,13 +534,14 @@ static void kill_process_from_timer(void* arg) void simcall_process_set_kill_time(smx_process_t process, double kill_time) { - if (kill_time > SIMIX_get_clock()) { - if (simix_global->kill_process_function) { - XBT_DEBUG("Set kill time %f for process %s(%s)",kill_time, process->name, - sg_host_get_name(process->host)); - process->kill_timer = SIMIX_timer_set(kill_time, kill_process_from_timer, process); - } - } + if (kill_time <= SIMIX_get_clock() || simix_global->kill_process_function == nullptr) + return; + XBT_DEBUG("Set kill time %f for process %s(%s)", + kill_time, process->name.c_str(), sg_host_get_name(process->host)); + process->kill_timer = SIMIX_timer_set(kill_time, [=] { + simix_global->kill_process_function(process); + process->kill_timer=NULL; + }); } /** * \ingroup simix_process_management @@ -709,9 +677,10 @@ smx_mailbox_t simcall_mbox_get_by_name(const char *name) * \param mbox The rendez-vous point * \return The communication or NULL if empty */ -smx_synchro_t simcall_mbox_get_head(smx_mailbox_t mbox) +smx_synchro_t simcall_mbox_front(smx_mailbox_t mbox) { - return simcall_BODY_mbox_get_head(mbox); + + return mbox->comm_queue->empty()? nullptr:mbox->comm_queue->front(); } void simcall_mbox_set_receiver(smx_mailbox_t mbox, smx_process_t process) @@ -719,11 +688,6 @@ void simcall_mbox_set_receiver(smx_mailbox_t mbox, smx_process_t process) simcall_BODY_mbox_set_receiver(mbox, process); } -smx_process_t simcall_mbox_get_receiver(smx_mailbox_t mbox) -{ - return simcall_BODY_mbox_get_receiver(mbox); -} - /** * \ingroup simix_comm_management */ @@ -828,9 +792,12 @@ smx_synchro_t simcall_comm_iprobe(smx_mailbox_t mbox, int type, int src, int tag /** * \ingroup simix_comm_management */ -void simcall_comm_cancel(smx_synchro_t comm) +void simcall_comm_cancel(smx_synchro_t synchro) { - simcall_BODY_comm_cancel(comm); + simgrid::simix::kernel([synchro]{ + simgrid::simix::Comm *comm = static_cast(synchro); + comm->cancel(); + }); } /** @@ -884,51 +851,6 @@ int simcall_comm_test(smx_synchro_t comm) return simcall_BODY_comm_test(comm); } -/** - * \ingroup simix_comm_management - * - */ -double simcall_comm_get_remains(smx_synchro_t comm) -{ - return simcall_BODY_comm_get_remains(comm); -} - -/** - * \ingroup simix_comm_management - * - */ -void *simcall_comm_get_src_data(smx_synchro_t comm) -{ - return simcall_BODY_comm_get_src_data(comm); -} - -/** - * \ingroup simix_comm_management - * - */ -void *simcall_comm_get_dst_data(smx_synchro_t comm) -{ - return simcall_BODY_comm_get_dst_data(comm); -} - -/** - * \ingroup simix_comm_management - * - */ -smx_process_t simcall_comm_get_src_proc(smx_synchro_t comm) -{ - return simcall_BODY_comm_get_src_proc(comm); -} - -/** - * \ingroup simix_comm_management - * - */ -smx_process_t simcall_comm_get_dst_proc(smx_synchro_t comm) -{ - return simcall_BODY_comm_get_dst_proc(comm); -} - /** * \ingroup simix_synchro_management * @@ -1206,7 +1128,7 @@ xbt_dict_t simcall_storage_get_content(smx_storage_t storage) void simcall_run_kernel(std::function const& code) { - return simcall_BODY_run_kernel((void*) &code); + return simcall_BODY_run_kernel(&code); } int simcall_mc_random(int min, int max) {