class Simcall;
class SimcallObserver;
class MutexObserver;
+class ConditionVariableObserver;
class ObjectAccessSimcallObserver;
class ObjectAccessSimcallItem;
} // namespace actor
/* Now transform the cond wait simcall into a mutex lock one */
actor::Simcall* simcall = &proc.simcall_;
- const auto* observer = dynamic_cast<kernel::actor::ConditionWaitSimcall*>(simcall->observer_);
+ const auto* observer = dynamic_cast<kernel::actor::ConditionVariableObserver*>(simcall->observer_);
xbt_assert(observer != nullptr);
observer->get_mutex()->lock_async(simcall->issuer_)->wait_for(simcall->issuer_, -1);
}
/* If there is a mutex unlock it */
if (mutex != nullptr) {
- xbt_assert(mutex->get_owner() == issuer,
- "Actor %s cannot wait on ConditionVariable %p since it does not own the provided mutex %p",
- issuer->get_cname(), this, mutex);
+ auto* owner = mutex->get_owner();
+ xbt_assert(owner == issuer,
+ "Actor %s cannot wait on ConditionVariable %p since it does not own the provided mutex %p (which is "
+ "owned by %s).",
+ issuer->get_cname(), this, mutex, (owner == nullptr ? "nobody" : owner->get_cname()));
mutex_ = mutex;
mutex->unlock(issuer);
}
SynchroImplPtr synchro(new SynchroImpl([this, issuer]() {
this->remove_sleeping_actor(*issuer);
- auto* observer = dynamic_cast<kernel::actor::ConditionWaitSimcall*>(issuer->simcall_.observer_);
+ auto* observer = dynamic_cast<kernel::actor::ConditionVariableObserver*>(issuer->simcall_.observer_);
xbt_assert(observer != nullptr);
observer->set_result(true);
}));
#define SIMGRID_KERNEL_ACTIVITY_CONDITIONVARIABLE_HPP
#include "simgrid/s4u/ConditionVariable.hpp"
+#include "src/kernel/activity/ActivityImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
+
#include <boost/intrusive/list.hpp>
namespace simgrid::kernel::activity {
(type_ == mc::Transition::Type::BARRIER_WAIT && acquisition_ != nullptr && acquisition_->granted_);
}
-bool ConditionWaitSimcall::is_enabled()
+bool ConditionVariableObserver::is_enabled()
{
if (static bool warned = false; not warned) {
XBT_INFO("Using condition variables in model-checked code is still experimental. Use at your own risk");
}
return true;
}
-void ConditionWaitSimcall::serialize(std::stringstream& stream) const
+void ConditionVariableObserver::serialize(std::stringstream& stream) const
{
THROW_UNIMPLEMENTED;
}
-std::string ConditionWaitSimcall::to_string() const
+std::string ConditionVariableObserver::to_string() const
{
return "ConditionWait(cond_id:" + ptr_to_id<activity::ConditionVariableImpl const>(get_cond()) +
" mutex_id:" + std::to_string(get_mutex()->get_id()) + ")";
double get_timeout() const { return timeout_; }
};
-class ConditionWaitSimcall final : public ResultingSimcall<bool> {
+class ConditionVariableObserver final : public ResultingSimcall<bool> {
mc::Transition::Type type_;
activity::ConditionVariableImpl* const cond_;
activity::MutexImpl* const mutex_;
const double timeout_;
public:
- ConditionWaitSimcall(ActorImpl* actor, activity::ConditionVariableImpl* cond, activity::MutexImpl* mutex,
- double timeout = -1.0)
+ ConditionVariableObserver(ActorImpl* actor, activity::ConditionVariableImpl* cond, activity::MutexImpl* mutex,
+ double timeout = -1.0)
: ResultingSimcall(actor, false), cond_(cond), mutex_(mutex), timeout_(timeout)
{
}
void ConditionVariable::wait(MutexPtr lock)
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- kernel::actor::ConditionWaitSimcall observer{issuer, pimpl_, lock->pimpl_};
+ kernel::actor::ConditionVariableObserver 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();
- kernel::actor::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_};
+ kernel::actor::ConditionVariableObserver 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();
- kernel::actor::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_, timeout};
+ kernel::actor::ConditionVariableObserver 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);