include src/kernel/activity/SynchroRaw.hpp
include src/kernel/actor/ActorImpl.cpp
include src/kernel/actor/ActorImpl.hpp
+include src/kernel/actor/SimcallObserver.cpp
+include src/kernel/actor/SimcallObserver.hpp
include src/kernel/context/Context.cpp
include src/kernel/context/Context.hpp
include src/kernel/context/ContextBoost.cpp
include src/mc/checker/LivenessChecker.hpp
include src/mc/checker/SafetyChecker.cpp
include src/mc/checker/SafetyChecker.hpp
-include src/mc/checker/SimcallObserver.cpp
-include src/mc/checker/SimcallObserver.hpp
include src/mc/checker/UdporChecker.cpp
include src/mc/checker/UdporChecker.hpp
include src/mc/checker/simgrid_mc.cpp
using ActorCode = std::function<void()>;
// Create an ActorCode from the parameters parsed in the XML file (or elsewhere)
using ActorCodeFactory = std::function<ActorCode(std::vector<std::string> args)>;
+
+class SimcallObserver;
} // namespace actor
namespace activity {
}
namespace mc {
class CommunicationDeterminismChecker;
-class SimcallObserver;
}
namespace vm {
class VMModel;
#include <string>
#include <unordered_map>
-XBT_PUBLIC void simcall_run_kernel(std::function<void()> const& code, simgrid::mc::SimcallObserver* observer);
-XBT_PUBLIC void simcall_run_blocking(std::function<void()> const& code, simgrid::mc::SimcallObserver* observer);
+XBT_PUBLIC void simcall_run_kernel(std::function<void()> const& code,
+ simgrid::kernel::actor::SimcallObserver* observer);
+XBT_PUBLIC void simcall_run_blocking(std::function<void()> const& code,
+ simgrid::kernel::actor::SimcallObserver* observer);
namespace simgrid {
namespace kernel {
* you may need to wait for that mutex to be unlocked by its current owner.
* Potentially blocking simcall must be issued using simcall_blocking(), right below in this file.
*/
-template <class F> typename std::result_of_t<F()> simcall(F&& code, mc::SimcallObserver* observer = nullptr)
+template <class F> typename std::result_of_t<F()> simcall(F&& code, SimcallObserver* observer = nullptr)
{
// If we are in the maestro, we take the fast path and execute the
// code directly without simcall marshalling/unmarshalling/dispatch:
*
* The return value is obtained from observer->get_result() if it exists. Otherwise void is returned.
*/
-template <class F> void simcall_blocking(F&& code, mc::SimcallObserver* observer = nullptr)
+template <class F> void simcall_blocking(F&& code, SimcallObserver* observer = nullptr)
{
xbt_assert(not SIMIX_is_maestro(), "Cannot execute blocking call in kernel mode");
template <class F, class Observer>
auto simcall_blocking(F&& code, Observer* observer) -> decltype(observer->get_result())
{
- simcall_blocking(std::forward<F>(code), static_cast<mc::SimcallObserver*>(observer));
+ simcall_blocking(std::forward<F>(code), static_cast<SimcallObserver*>(observer));
return observer->get_result();
}
} // namespace actor
#include "simgrid/Exception.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
#include "src/kernel/activity/SynchroRaw.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include <cmath> // std::isfinite
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_condition, simix_synchro, "Condition variables");
/* Now transform the cond wait simcall into a mutex lock one */
smx_simcall_t simcall = &proc.simcall_;
- const auto* observer = dynamic_cast<mc::ConditionWaitSimcall*>(simcall->observer_);
+ const auto* observer = dynamic_cast<kernel::actor::ConditionWaitSimcall*>(simcall->observer_);
xbt_assert(observer != nullptr);
observer->get_mutex()->lock(simcall->issuer_);
}
RawImplPtr synchro(new RawImpl([this, issuer]() {
this->remove_sleeping_actor(*issuer);
- auto* observer = dynamic_cast<mc::ConditionWaitSimcall*>(issuer->simcall_.observer_);
+ auto* observer = dynamic_cast<kernel::actor::ConditionWaitSimcall*>(issuer->simcall_.observer_);
xbt_assert(observer != nullptr);
observer->set_result(true);
}));
#include "simgrid/kernel/routing/NetPoint.hpp"
#include "simgrid/modelchecker.h"
#include "simgrid/s4u/Exec.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "src/mc/mc_replay.hpp"
#include "src/surf/HostImpl.hpp"
#include "src/surf/cpu_interface.hpp"
if (simcall->call_ == simix::Simcall::NONE) // FIXME: maybe a better way to handle this case
continue; // if process handling comm is killed
- if (auto* observer = dynamic_cast<mc::ExecutionWaitanySimcall*>(simcall->observer_)) { // simcall is a wait_any?
+ if (auto* observer =
+ dynamic_cast<kernel::actor::ExecutionWaitanySimcall*>(simcall->observer_)) { // simcall is a wait_any?
const auto* execs = observer->get_execs();
for (auto* exec : *execs) {
#include "src/kernel/activity/SemaphoreImpl.hpp"
#include "src/kernel/activity/SynchroRaw.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include <cmath> // std::isfinite
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_semaphore, simix_synchro, "Semaphore kernel-space implementation");
if (value_ <= 0) {
RawImplPtr synchro(new RawImpl([this, issuer]() {
this->remove_sleeping_actor(*issuer);
- auto* observer = dynamic_cast<mc::SemAcquireSimcall*>(issuer->simcall_.observer_);
+ auto* observer = dynamic_cast<kernel::actor::SemAcquireSimcall*>(issuer->simcall_.observer_);
xbt_assert(observer != nullptr);
observer->set_result(true);
}));
/* 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/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "simgrid/s4u/Host.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_observer, mc, "Logging specific to MC simcall observation");
namespace simgrid {
-namespace mc {
+namespace kernel {
+namespace actor {
std::string SimcallObserver::to_string(int /*time_considered*/) const
{
{
return SimcallObserver::dot_label() + "Execution WAITANY";
}
-} // namespace mc
+} // namespace actor
+} // namespace kernel
} // namespace simgrid
#include <string>
namespace simgrid {
-namespace mc {
+namespace kernel {
+namespace actor {
class SimcallObserver {
kernel::actor::ActorImpl* const issuer_;
*
* The first time a simcall is considered, times_considered is 0, not 1.
*/
- virtual void prepare(int times_considered) { /* Nothing to do by default */}
+ virtual void prepare(int times_considered)
+ { /* Nothing to do by default */
+ }
/** Some simcalls may only be observable under some circumstances.
* Most simcalls are not visible from the MC because they don't have an observer at all. */
int get_result() const { return result_; }
};
-} // namespace mc
+} // namespace actor
+} // namespace kernel
} // namespace simgrid
#endif
#include "src/kernel/activity/MailboxImpl.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "src/mc/Session.hpp"
#include "src/mc/checker/Checker.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
#include "src/mc/mc_comm_pattern.hpp"
#include "src/mc/mc_exit.hpp"
#include "src/mc/mc_pattern.hpp"
#include "mc/mc.h"
#include "src/kernel/activity/CommImpl.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "src/mc/mc_config.hpp"
#include "src/mc/mc_replay.hpp"
#include "src/simix/smx_private.hpp"
static simgrid::xbt::random::XbtRandom prng;
return prng.uniform_int(min, max);
}
- simgrid::mc::RandomSimcall observer{SIMIX_process_self(), min, max};
+ simgrid::kernel::actor::RandomSimcall observer{SIMIX_process_self(), min, max};
return simgrid::kernel::actor::simcall([&observer] { return observer.get_value(); }, &observer);
}
#include "src/mc/remote/AppSide.hpp"
#include "src/internal_config.h"
#include "src/kernel/actor/ActorImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "src/mc/remote/RemoteProcess.hpp"
#include "src/xbt_modinter.h" /* mmalloc_preinit to get the default mmalloc arena address */
#include <simgrid/modelchecker.h>
#include "simgrid/simix.h"
#include "src/kernel/activity/ConditionVariableImpl.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "xbt/log.hpp"
#include <exception>
void ConditionVariable::wait(MutexPtr lock)
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::ConditionWaitSimcall observer{issuer, pimpl_, lock->pimpl_};
+ kernel::actor::ConditionWaitSimcall observer{issuer, pimpl_, lock->pimpl_};
kernel::actor::simcall_blocking(
[&observer] { observer.get_cond()->wait(observer.get_mutex(), -1.0, observer.get_issuer()); }, &observer);
}
void ConditionVariable::wait(const std::unique_lock<Mutex>& lock)
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_};
+ kernel::actor::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_};
kernel::actor::simcall_blocking(
[&observer] { observer.get_cond()->wait(observer.get_mutex(), -1.0, observer.get_issuer()); }, &observer);
}
timeout = 0.0;
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_, timeout};
+ kernel::actor::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_, timeout};
bool timed_out = kernel::actor::simcall_blocking(
[&observer] { observer.get_cond()->wait(observer.get_mutex(), observer.get_timeout(), observer.get_issuer()); },
&observer);
#include "simgrid/s4u/Exec.hpp"
#include "src/kernel/activity/ExecImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "xbt/log.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_exec, s4u_activity, "S4U asynchronous executions");
[](const ExecPtr& exec) { return static_cast<kernel::activity::ExecImpl*>(exec->pimpl_.get()); });
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::ExecutionWaitanySimcall observer{issuer, &rexecs, timeout};
+ kernel::actor::ExecutionWaitanySimcall observer{issuer, &rexecs, timeout};
int changed_pos = kernel::actor::simcall_blocking(
[&observer] {
kernel::activity::ExecImpl::wait_any_for(observer.get_issuer(), observer.get_execs(), observer.get_timeout());
#include "simgrid/mutex.h"
#include "simgrid/s4u/Mutex.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
namespace simgrid {
namespace s4u {
void Mutex::lock()
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::MutexLockSimcall observer{issuer, pimpl_};
+ kernel::actor::MutexLockSimcall observer{issuer, pimpl_};
kernel::actor::simcall_blocking([&observer] { observer.get_mutex()->lock(observer.get_issuer()); }, &observer);
}
void Mutex::unlock()
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::MutexUnlockSimcall observer{issuer};
+ kernel::actor::MutexUnlockSimcall observer{issuer};
kernel::actor::simcall([this, issuer] { this->pimpl_->unlock(issuer); }, &observer);
}
bool Mutex::try_lock()
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::MutexLockSimcall observer{issuer, pimpl_, false};
+ kernel::actor::MutexLockSimcall observer{issuer, pimpl_, false};
return kernel::actor::simcall([&observer] { return observer.get_mutex()->try_lock(observer.get_issuer()); },
&observer);
}
#include "simgrid/forward.h"
#include "simgrid/s4u/Semaphore.hpp"
#include "src/kernel/activity/SemaphoreImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
namespace simgrid {
namespace s4u {
void Semaphore::acquire()
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::SemAcquireSimcall observer{issuer, pimpl_};
+ kernel::actor::SemAcquireSimcall observer{issuer, pimpl_};
kernel::actor::simcall_blocking([&observer] { observer.get_sem()->acquire(observer.get_issuer(), -1.0); }, &observer);
}
bool Semaphore::acquire_timeout(double timeout)
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::SemAcquireSimcall observer{issuer, pimpl_, timeout};
+ kernel::actor::SemAcquireSimcall observer{issuer, pimpl_, timeout};
return kernel::actor::simcall_blocking(
[&observer] { observer.get_sem()->acquire(observer.get_issuer(), observer.get_timeout()); }, &observer);
}
#include "src/kernel/activity/MailboxImpl.hpp"
#include "src/kernel/activity/MutexImpl.hpp"
#include "src/kernel/activity/SemaphoreImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
#include "src/mc/mc_replay.hpp"
#include "src/plugins/vm/VirtualMachineImpl.hpp"
#include "xbt/random.hpp"
{
std::vector<simgrid::kernel::activity::ExecImpl*> execsv(execs, execs + count);
simgrid::kernel::actor::ActorImpl* issuer = simgrid::kernel::actor::ActorImpl::self();
- simgrid::mc::ExecutionWaitanySimcall observer{issuer, &execsv, timeout};
+ simgrid::kernel::actor::ExecutionWaitanySimcall observer{issuer, &execsv, timeout};
return simgrid::kernel::actor::simcall_blocking(
[&observer] {
simgrid::kernel::activity::ExecImpl::wait_any_for(observer.get_issuer(), observer.get_execs(),
return simgrid::kernel::actor::simcall([io] { return io->test(); });
}
-void simcall_run_kernel(std::function<void()> const& code, simgrid::mc::SimcallObserver* observer)
+void simcall_run_kernel(std::function<void()> const& code, simgrid::kernel::actor::SimcallObserver* observer)
{
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = observer;
simcall_BODY_run_kernel(&code);
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = nullptr;
}
-void simcall_run_blocking(std::function<void()> const& code, simgrid::mc::SimcallObserver* observer)
+void simcall_run_blocking(std::function<void()> const& code, simgrid::kernel::actor::SimcallObserver* observer)
{
simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = observer;
simcall_BODY_run_blocking(&code);
#include "src/mc/mc_forward.hpp"
#endif
#include "src/kernel/activity/ConditionVariableImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_popping);
simgrid::simix::Simcall call_ = simgrid::simix::Simcall::NONE;
smx_actor_t issuer_ = nullptr;
smx_timer_t timeout_cb_ = nullptr; // Callback to timeouts
- simgrid::mc::SimcallObserver* observer_ = nullptr; // makes that simcall observable by the MC
+ simgrid::kernel::actor::SimcallObserver* observer_ = nullptr; // makes that simcall observable by the MC
unsigned int mc_max_consider_ = 0; // How many times this simcall should be used. If >1, this will be a fork.
int mc_value_ = 0;
std::array<u_smx_scalar, 11> args_ = {};
fd.write('#include "src/mc/mc_forward.hpp"\n')
fd.write('#endif\n')
fd.write('#include "src/kernel/activity/ConditionVariableImpl.hpp"\n')
- fd.write('#include "src/mc/checker/SimcallObserver.hpp"\n')
+ fd.write('#include "src/kernel/actor/SimcallObserver.hpp"\n')
fd.write('\n')
fd.write('XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_popping);\n\n')
src/kernel/activity/SynchroRaw.hpp
src/kernel/actor/ActorImpl.cpp
src/kernel/actor/ActorImpl.hpp
+ src/kernel/actor/SimcallObserver.cpp
+ src/kernel/actor/SimcallObserver.hpp
${SIMIX_GENERATED_SRC}
)
src/mc/mc_config.cpp
src/mc/mc_config.hpp
src/mc/mc_global.cpp
- src/mc/checker/SimcallObserver.cpp
- src/mc/checker/SimcallObserver.hpp
)
set(MC_SRC