X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9e0cb12b3a4d809e8405430fa6513780044d4122..a14791b7288177a49b6e8b06677d59faac0a175e:/src/simix/popping.cpp diff --git a/src/simix/popping.cpp b/src/simix/popping.cpp index b32b3948f4..2e7e046bee 100644 --- a/src/simix/popping.cpp +++ b/src/simix/popping.cpp @@ -3,11 +3,51 @@ /* 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 "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" XBT_LOG_NEW_DEFAULT_CATEGORY(simix, "transmuting from user request into kernel handlers"); +constexpr std::array simcall_names{{ + "Simcall::NONE", + "Simcall::RUN_KERNEL", + "Simcall::RUN_BLOCKING", +}}; + +/** @private + * @brief (in kernel mode) unpack the simcall and activate the handler + * + * This function is generated from src/simix/simcalls.in + */ +void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered) +{ + XBT_DEBUG("Handling simcall %p: %s", &simcall_, SIMIX_simcall_name(simcall_)); + if (simcall_.observer_ != nullptr) + simcall_.observer_->prepare(times_considered); + if (context_->wannadie()) + return; + switch (simcall_.call_) { + case simgrid::simix::Simcall::RUN_KERNEL: + SIMIX_run_kernel(simcall_.code_); + simcall_answer(); + break; + + case simgrid::simix::Simcall::RUN_BLOCKING: + SIMIX_run_blocking(simcall_.code_); + break; + + case simgrid::simix::Simcall::NONE: + throw std::invalid_argument( + simgrid::xbt::string_printf("Asked to do the noop syscall on %s@%s", get_cname(), get_host()->get_cname())); + default: + THROW_IMPOSSIBLE; + } +} + void SIMIX_run_kernel(std::function const* code) { (*code)();