X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/418ac8d537f356100767b8a21f65e16f7ba1d986..ee004ae503ecdf8ddbf1e0cf080aab5702fc66d1:/src/simix/popping.cpp diff --git a/src/simix/popping.cpp b/src/simix/popping.cpp index e4a621b274..74bf611581 100644 --- a/src/simix/popping.cpp +++ b/src/simix/popping.cpp @@ -1,75 +1,54 @@ -/* Copyright (c) 2010-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2022. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "smx_private.h" -#include "xbt/fifo.h" -#include "xbt/xbt_os_thread.h" -#if HAVE_MC -#include "src/mc/mc_private.h" -#endif +#include "simgrid/s4u/Host.hpp" +#include "src/kernel/actor/ActorImpl.hpp" +#include "src/kernel/actor/SimcallObserver.hpp" +#include "src/kernel/context/Context.hpp" +#include "src/simix/popping_private.hpp" +#include "xbt/log.h" -#include "src/simix/SynchroExec.hpp" -#include "src/simix/SynchroComm.hpp" -#include "src/simix/SynchroSleep.hpp" -#include "src/simix/SynchroRaw.hpp" -#include "src/simix/SynchroIo.hpp" +XBT_LOG_NEW_DEFAULT_CATEGORY(simix, "transmuting from user request into kernel handlers"); -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_popping, simix, - "Popping part of SIMIX (transmuting from user request into kernel handlers)"); +constexpr std::array simcall_names{{ + "Simcall::NONE", + "Simcall::RUN_ANSWERED", + "Simcall::RUN_BLOCKING", +}}; -void SIMIX_simcall_answer(smx_simcall_t simcall) -{ - if (simcall->issuer != simix_global->maestro_process){ - XBT_DEBUG("Answer simcall %s (%d) issued by %s (%p)", SIMIX_simcall_name(simcall->call), (int)simcall->call, - simcall->issuer->name, simcall->issuer); - simcall->issuer->simcall.call = SIMCALL_NONE; -/* This check should be useless and slows everyone. Reactivate if you see something - * weird in process scheduling. +/** @private + * @brief (in kernel mode) unpack the simcall and activate the handler + * */ -/* if(!xbt_dynar_member(simix_global->process_to_run, &(simcall->issuer))) */ - xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, simcall->issuer); -/* else DIE_IMPOSSIBLE; */ - } -} - -void SIMIX_simcall_exit(smx_synchro_t synchro) +void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered) { - simgrid::simix::Exec *exec = dynamic_cast(synchro); - if (exec != nullptr) { - SIMIX_post_host_execute(synchro); - return; - } - - simgrid::simix::Comm *comm = dynamic_cast(synchro); - if (comm != nullptr) { - SIMIX_post_comm(synchro); - return; - } - - simgrid::simix::Sleep *sleep = dynamic_cast(synchro); - if (sleep != nullptr) { - SIMIX_post_process_sleep(synchro); + XBT_DEBUG("Handling simcall %p: %s", &simcall_, SIMIX_simcall_name(simcall_)); + if (simcall_.observer_ != nullptr) + simcall_.observer_->prepare(times_considered); + if (context_->wannadie()) return; - } - simgrid::simix::Raw *raw = dynamic_cast(synchro); - if (raw != nullptr) { - SIMIX_post_synchro(synchro); - return; - } + xbt_assert(simcall_.call_ != simgrid::simix::Simcall::NONE, "Asked to do the noop syscall on %s@%s", get_cname(), + get_host()->get_cname()); - simgrid::simix::Io *io = dynamic_cast(synchro); - if (io != nullptr) { - SIMIX_post_io(synchro); - return; - } + (*simcall_.code_)(); + if (simcall_.call_ == simgrid::simix::Simcall::RUN_ANSWERED) + simcall_answer(); } -void SIMIX_run_kernel(void* code) +/** @brief returns a printable string representing a simcall */ +const char* SIMIX_simcall_name(const s_smx_simcall& simcall) { - std::function* function = (std::function*) code; - (*function)(); + if (simcall.observer_ != nullptr) { + static std::string name; + name = boost::core::demangle(typeid(*simcall.observer_).name()); + const char* cname = name.c_str(); + if (name.rfind("simgrid::kernel::", 0) == 0) + cname += 17; // strip prefix "simgrid::kernel::" + return cname; + } else { + return simcall_names.at(static_cast(simcall.call_)); + } }