X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/84402e8e2ee2a2d0bef25fdceb0a263ed8b471f6..7f58e0660b9c6d8bb61f878b21aa5a209325097c:/src/simix/popping.cpp diff --git a/src/simix/popping.cpp b/src/simix/popping.cpp index f1e5ab48e4..93544f8a93 100644 --- a/src/simix/popping.cpp +++ b/src/simix/popping.cpp @@ -1,27 +1,55 @@ -/* Copyright (c) 2010-2020. 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.hpp" +#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_SUBCATEGORY(simix_popping, simix, - "Popping part of SIMIX (transmuting from user request into kernel handlers)"); +XBT_LOG_NEW_DEFAULT_CATEGORY(simix, "transmuting from user request into kernel handlers"); -void SIMIX_run_kernel(std::function const* code) -{ - (*code)(); -} +constexpr std::array simcall_names{{ + "Simcall::NONE", + "Simcall::RUN_ANSWERED", + "Simcall::RUN_BLOCKING", +}}; -/** Kernel code for run_blocking - * - * The implementation looks a lot like SIMIX_run_kernel ^^ +/** @private + * @brief (in kernel mode) unpack the simcall and activate the handler * - * However, this `run_blocking` is blocking so the process will not be woken - * up until `ActorImpl::simcall_answer()`` is called by the kernel. - * This means that `code` is responsible for doing this. */ -void SIMIX_run_blocking(std::function const* code) +void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered) { - (*code)(); + XBT_DEBUG("Handling simcall %p: %s", &simcall_, SIMIX_simcall_name(simcall_)); + if (simcall_.observer_ != nullptr) + simcall_.observer_->prepare(times_considered); + if (context_->wannadie()) + return; + + xbt_assert(simcall_.call_ != simgrid::simix::Simcall::NONE, "Asked to do the noop syscall on %s@%s", get_cname(), + get_host()->get_cname()); + + (*simcall_.code_)(); + if (simcall_.call_ == simgrid::simix::Simcall::RUN_ANSWERED) + simcall_answer(); +} + +/** @brief returns a printable string representing a simcall */ +const char* SIMIX_simcall_name(const s_smx_simcall& simcall) +{ + 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_)); + } }