X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/48efae676c3604efffe21365b2d525e578fd22e5..713b1a8b721fd0646d943fc59e2f4309de115961:/src/simix/popping.cpp diff --git a/src/simix/popping.cpp b/src/simix/popping.cpp index 631bc80f22..135fdcc03a 100644 --- a/src/simix/popping.cpp +++ b/src/simix/popping.cpp @@ -1,47 +1,48 @@ -/* 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)"); - -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) { - synchro->post(); + 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(); } -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 to_c_str(simcall.call_); + } }