include src/kernel/actor/ActorImpl.hpp
include src/kernel/actor/CommObserver.cpp
include src/kernel/actor/CommObserver.hpp
+include src/kernel/actor/Simcall.cpp
+include src/kernel/actor/Simcall.hpp
include src/kernel/actor/SimcallObserver.cpp
include src/kernel/actor/SimcallObserver.hpp
include src/kernel/actor/SynchroObserver.cpp
include src/simgrid/sg_version.cpp
include src/simgrid/util.hpp
include src/simix/libsmx.cpp
-include src/simix/simcall.cpp
-include src/simix/simcall.hpp
include src/simix/smx_context.cpp
include src/smpi/bindings/smpi_f77.cpp
include src/smpi/bindings/smpi_f77_coll.cpp
// Create an ActorCode from the parameters parsed in the XML file (or elsewhere)
using ActorCodeFactory = std::function<ActorCode(std::vector<std::string> args)>;
+class Simcall;
class SimcallObserver;
} // namespace actor
class Profile;
} // namespace profile
} // namespace kernel
-namespace simix {
-class Simcall;
-}
namespace mc {
class State;
}
*/
for (auto const& actor : actors_that_ran_) {
- if (actor->simcall_.call_ != simix::Simcall::Type::NONE) {
+ if (actor->simcall_.call_ != actor::Simcall::Type::NONE) {
actor->simcall_handle(0);
}
}
XBT_DEBUG("Destroy activity %p", this);
}
-void ActivityImpl::register_simcall(simix::Simcall* simcall)
+void ActivityImpl::register_simcall(actor::Simcall* simcall)
{
simcalls_.push_back(simcall);
simcall->issuer_->waiting_synchro_ = this;
}
-void ActivityImpl::unregister_simcall(simix::Simcall* simcall)
+void ActivityImpl::unregister_simcall(actor::Simcall* simcall)
{
// Remove the first occurrence of simcall:
auto j = boost::range::find(simcalls_, simcall);
state_ = State::CANCELED;
}
-void ActivityImpl::handle_activity_waitany(simix::Simcall* simcall)
+void ActivityImpl::handle_activity_waitany(actor::Simcall* simcall)
{
/* If a waitany simcall is waiting for this synchro to finish, then remove it from the other synchros in the waitany
* list. Afterwards, get the position of the actual synchro in the waitany list and return it as the result of the
public:
virtual ~ActivityImpl();
ActivityImpl() = default;
- std::list<simix::Simcall*> simcalls_; /* List of simcalls waiting for this activity */
+ std::list<actor::Simcall*> simcalls_; /* List of simcalls waiting for this activity */
s4u::Activity* piface_ = nullptr;
resource::Action* surf_action_ = nullptr;
virtual void finish() = 0; // Unlock all simcalls blocked on that activity, either because it was marked as done by
// the model or because it terminated without waiting for the model
- void register_simcall(simix::Simcall* simcall);
- void unregister_simcall(simix::Simcall* simcall);
- void handle_activity_waitany(simix::Simcall* simcall);
+ void register_simcall(actor::Simcall* simcall);
+ void unregister_simcall(actor::Simcall* simcall);
+ void handle_activity_waitany(actor::Simcall* simcall);
void clean_action();
virtual double get_remaining() const;
// Support for the boost::intrusive_ptr<ActivityImpl> datatype
void BarrierAcquisitionImpl::finish()
{
xbt_assert(simcalls_.size() == 1, "Unexpected number of simcalls waiting: %zu", simcalls_.size());
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
simcall->issuer_->waiting_synchro_ = nullptr;
copy_data();
while (not simcalls_.empty()) {
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
/* If a waitany simcall is waiting for this synchro to finish, then remove it from the other synchros in the waitany
* list. Afterwards, get the position of the actual synchro in the waitany list and return it as the result of the
* simcall */
- if (simcall->call_ == simix::Simcall::Type::NONE) // FIXME: maybe a better way to handle this case
+ if (simcall->call_ == actor::Simcall::Type::NONE) // FIXME: maybe a better way to handle this case
continue; // if actor handling comm is killed
handle_activity_waitany(simcall);
proc.waiting_synchro_ = nullptr;
/* Now transform the cond wait simcall into a mutex lock one */
- simix::Simcall* simcall = &proc.simcall_;
+ actor::Simcall* simcall = &proc.simcall_;
const auto* observer = dynamic_cast<kernel::actor::ConditionWaitSimcall*>(simcall->observer_);
xbt_assert(observer != nullptr);
observer->get_mutex()->lock_async(simcall->issuer_)->wait_for(simcall->issuer_, -1);
{
XBT_DEBUG("ExecImpl::finish() in state %s", get_state_str());
while (not simcalls_.empty()) {
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
- if (simcall->call_ == simix::Simcall::Type::NONE) // FIXME: maybe a better way to handle this case
+ if (simcall->call_ == actor::Simcall::Type::NONE) // FIXME: maybe a better way to handle this case
continue; // if process handling comm is killed
handle_activity_waitany(simcall);
{
XBT_DEBUG("IoImpl::finish() in state %s", get_state_str());
while (not simcalls_.empty()) {
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
/* If a waitany simcall is waiting for this synchro to finish, then remove it from the other synchros in the waitany
* list. Afterwards, get the position of the actual synchro in the waitany list and return it as the result of the
* simcall */
- if (simcall->call_ == simix::Simcall::Type::NONE) // FIXME: maybe a better way to handle this case
+ if (simcall->call_ == actor::Simcall::Type::NONE) // FIXME: maybe a better way to handle this case
continue; // if process handling comm is killed
handle_activity_waitany(simcall);
void MutexAcquisitionImpl::finish()
{
xbt_assert(simcalls_.size() == 1, "Unexpected number of simcalls waiting: %zu", simcalls_.size());
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
simcall->issuer_->waiting_synchro_ = nullptr;
void SemAcquisitionImpl::finish()
{
xbt_assert(simcalls_.size() == 1, "Unexpected number of simcalls waiting: %zu", simcalls_.size());
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
if (surf_action_ != nullptr) { // A timeout was declared
{
XBT_DEBUG("SleepImpl::finish() in state %s", get_state_str());
while (not simcalls_.empty()) {
- const simix::Simcall* simcall = simcalls_.front();
+ const actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
simcall->issuer_->waiting_synchro_ = nullptr;
{
XBT_DEBUG("SynchroImpl::finish() in state %s", get_state_str());
xbt_assert(simcalls_.size() == 1, "Unexpected number of simcalls waiting: %zu", simcalls_.size());
- simix::Simcall* simcall = simcalls_.front();
+ actor::Simcall* simcall = simcalls_.front();
simcalls_.pop_front();
set_exception(simcall->issuer_);
auto* engine = EngineImpl::get_instance();
if (not this->is_maestro()) {
XBT_DEBUG("Answer simcall %s issued by %s (%p)", simcall_.get_cname(), get_cname(), this);
- xbt_assert(simcall_.call_ != simix::Simcall::Type::NONE);
- simcall_.call_ = simix::Simcall::Type::NONE;
+ xbt_assert(simcall_.call_ != Simcall::Type::NONE);
+ simcall_.call_ = Simcall::Type::NONE;
const auto& actors_to_run = engine->get_actors_to_run();
xbt_assert(not XBT_LOG_ISENABLED(ker_actor, xbt_log_priority_debug) ||
std::find(begin(actors_to_run), end(actors_to_run), this) == end(actors_to_run),
#ifndef SIMGRID_KERNEL_ACTOR_ACTORIMPL_HPP
#define SIMGRID_KERNEL_ACTOR_ACTORIMPL_HPP
+#include "Simcall.hpp"
#include "simgrid/kernel/Timer.hpp"
#include "simgrid/s4u/Actor.hpp"
-#include "src/simix/simcall.hpp"
#include "xbt/PropertyHolder.hpp"
#include <boost/intrusive/list.hpp>
#include <functional>
activity::ActivityImplPtr waiting_synchro_ = nullptr; /* the current blocking synchro if any */
std::list<activity::ActivityImplPtr> activities_; /* the current non-blocking synchros */
- simix::Simcall simcall_;
+ Simcall simcall_;
/* list of functions executed when the actor dies */
std::shared_ptr<std::vector<std::function<void(bool)>>> on_exit =
std::make_shared<std::vector<std::function<void(bool)>>>();
/* 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 "src/simix/simcall.hpp"
+#include "Simcall.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 "xbt/log.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(simix, "transmuting from user request into kernel handlers");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_simcall, kernel, "transmuting from user request into kernel handlers");
+
+namespace simgrid {
+namespace kernel {
+namespace actor {
/** @private
* @brief (in kernel mode) unpack the simcall and activate the handler
*
*/
-void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered)
+void ActorImpl::simcall_handle(int times_considered)
{
XBT_DEBUG("Handling simcall %p: %s", &simcall_, simcall_.get_cname());
if (simcall_.observer_ != nullptr)
if (context_->wannadie())
return;
- xbt_assert(simcall_.call_ != simgrid::simix::Simcall::Type::NONE, "Asked to do the noop syscall on %s@%s",
- get_cname(), get_host()->get_cname());
+ xbt_assert(simcall_.call_ != Simcall::Type::NONE, "Asked to do the noop syscall on %s@%s", get_cname(),
+ get_host()->get_cname());
(*simcall_.code_)();
- if (simcall_.call_ == simgrid::simix::Simcall::Type::RUN_ANSWERED)
+ if (simcall_.call_ == Simcall::Type::RUN_ANSWERED)
simcall_answer();
}
/** @brief returns a printable string representing a simcall */
-const char* simgrid::simix::Simcall::get_cname() const
+const char* Simcall::get_cname() const
{
if (observer_ != nullptr) {
static std::string name;
return to_c_str(call_);
}
}
+
+} // namespace actor
+} // namespace kernel
+} // namespace simgrid
/********************************* Simcalls *********************************/
namespace simgrid {
-namespace simix {
+namespace kernel {
+namespace actor {
/**
* @brief Represents a simcall to the kernel.
const char* get_cname() const;
};
-} // namespace simix
+} // namespace actor
+} // namespace kernel
} // namespace simgrid
#endif
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(Api, mc, "Logging specific to MC Facade APIs ");
XBT_LOG_EXTERNAL_CATEGORY(mc_global);
-using Simcall = simgrid::simix::Simcall;
-
namespace simgrid {
namespace mc {
while (engine->has_actors_to_run()) {
engine->run_all_actors();
for (auto const& actor : engine->get_actors_that_ran()) {
- const simix::Simcall* req = &actor->simcall_;
- if (req->call_ != simix::Simcall::Type::NONE && not simgrid::mc::request_is_visible(req))
+ const kernel::actor::Simcall* req = &actor->simcall_;
+ if (req->call_ != kernel::actor::Simcall::Type::NONE && not simgrid::mc::request_is_visible(req))
actor->simcall_handle(0);
}
}
#endif
// Now, we are in the client app, no need for remote memory reading.
- simix::Simcall* req = &actor->simcall_;
+ kernel::actor::Simcall* req = &actor->simcall_;
if (req->observer_ != nullptr)
return req->observer_->is_enabled();
- if (req->call_ == simix::Simcall::Type::NONE)
+ if (req->call_ == kernel::actor::Simcall::Type::NONE)
return false;
else
/* The rest of the requests are always enabled */
/* This is the list of requests that are visible from the checker algorithm.
* Any other requests are handled right away on the application side.
*/
-bool request_is_visible(const simix::Simcall* req)
+bool request_is_visible(const kernel::actor::Simcall* req)
{
#if SIMGRID_HAVE_MC
xbt_assert(mc_model_checker == nullptr, "This should be called from the client side");
XBT_PRIVATE extern std::vector<double> processes_time;
/** Execute a given simcall */
-XBT_PRIVATE void handle_simcall(simix::Simcall* req, int req_num);
+XBT_PRIVATE void handle_simcall(kernel::actor::Simcall* req, int req_num);
/** Is the process ready to execute its simcall?
*
XBT_PRIVATE bool actor_is_enabled(smx_actor_t process);
/** Check if the given simcall is visible */
-XBT_PRIVATE bool request_is_visible(const simix::Simcall* req);
+XBT_PRIVATE bool request_is_visible(const kernel::actor::Simcall* req);
} // namespace mc
} // namespace simgrid
// Choose a request:
kernel::actor::ActorImpl* actor = kernel::actor::ActorImpl::by_pid(transition->aid_);
xbt_assert(actor != nullptr, "Unexpected actor (id:%ld).", transition->aid_);
- const simix::Simcall* simcall = &(actor->simcall_);
- xbt_assert(simcall->call_ != simix::Simcall::Type::NONE, "No simcall for process %ld.", transition->aid_);
+ const kernel::actor::Simcall* simcall = &(actor->simcall_);
+ xbt_assert(simcall->call_ != kernel::actor::Simcall::Type::NONE, "No simcall for process %ld.", transition->aid_);
xbt_assert(simgrid::mc::request_is_visible(simcall) && simgrid::mc::actor_is_enabled(actor), "Unexpected simcall.");
// Execute the request:
#define SIMIX_H_NO_DEPRECATED_WARNING // avoid deprecation warning on include (remove with XBT_ATTRIB_DEPRECATED_v335)
#include <simgrid/simix.h>
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ker_simcall);
/**
* @ingroup simix_comm_management
return false;
}
-static void simcall(simgrid::simix::Simcall::Type call, std::function<void()> const& code)
+static void simcall(simgrid::kernel::actor::Simcall::Type call, std::function<void()> const& code)
{
auto self = simgrid::kernel::actor::ActorImpl::self();
self->simcall_.call_ = call;
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = observer;
// The function `code` is called in kernel mode (either because we are already in maestor or after a context switch)
// and simcall_answer() is called
- simcall(simgrid::simix::Simcall::Type::RUN_ANSWERED, code);
+ simcall(simgrid::kernel::actor::Simcall::Type::RUN_ANSWERED, code);
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = nullptr;
}
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = observer;
// The function `code` is called in kernel mode (either because we are already in maestor or after a context switch)
// BUT simcall_answer IS NOT CALLED
- simcall(simgrid::simix::Simcall::Type::RUN_BLOCKING, code);
+ simcall(simgrid::kernel::actor::Simcall::Type::RUN_BLOCKING, code);
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = nullptr;
}
src/include/xbt/xbt_modinter.h
src/include/catch.hpp
src/include/xxhash.hpp
+ src/kernel/actor/Simcall.hpp
src/kernel/resource/LinkImpl.hpp
src/kernel/resource/SplitDuplexLinkImpl.hpp
src/kernel/resource/StandardLinkImpl.hpp
src/dag/dax.dtd
src/dag/dax_dtd.c
src/dag/dax_dtd.h
- src/simix/simcall.hpp
src/smpi/colls/coll_tuned_topo.hpp
src/smpi/colls/colls_private.hpp
src/smpi/colls/smpi_mvapich2_selector_stampede.hpp
src/kernel/actor/ActorImpl.hpp
src/kernel/actor/CommObserver.cpp
src/kernel/actor/CommObserver.hpp
+ src/kernel/actor/Simcall.cpp
src/kernel/actor/SimcallObserver.cpp
src/kernel/actor/SimcallObserver.hpp
src/kernel/actor/SynchroObserver.cpp
src/kernel/actor/SynchroObserver.hpp
src/simix/libsmx.cpp
- src/simix/simcall.cpp
src/simix/smx_context.cpp
)
list(REMOVE_ITEM src_list ${SIMIX_SRC} ${S4U_SRC})
# but...
list(APPEND src_list
- src/simix/simcall.cpp)
+ src/kernel/actor/Simcall.cpp)
foreach(src ${src_list})
set (mcCFLAGS "-O3 -funroll-loops -fno-strict-aliasing")
if(CMAKE_COMPILER_IS_GNUCC)