return SimcallObserver::dot_label() + "Mutex UNLOCK";
}
-std::string MutexTrylockSimcall::to_string(int time_considered) const
-{
- std::string res = SimcallObserver::to_string(time_considered) + "Mutex TRYLOCK";
- res += "(locked = " + std::to_string(mutex_->is_locked());
- res += ", owner = " + std::to_string(mutex_->get_owner() ? mutex_->get_owner()->get_pid() : -1);
- res += ", sleeping = n/a)";
- return res;
-}
-
-std::string MutexTrylockSimcall::dot_label() const
-{
- return SimcallObserver::dot_label() + "Mutex TRYLOCK";
-}
-
std::string MutexLockSimcall::to_string(int time_considered) const
{
- std::string res = SimcallObserver::to_string(time_considered) + "Mutex LOCK";
+ std::string res = SimcallObserver::to_string(time_considered) + (blocking_ ? "Mutex LOCK" : "Mutex TRYLOCK");
res += "(locked = " + std::to_string(mutex_->is_locked());
res += ", owner = " + std::to_string(mutex_->get_owner() ? mutex_->get_owner()->get_pid() : -1);
res += ", sleeping = n/a)";
std::string MutexLockSimcall::dot_label() const
{
- return SimcallObserver::dot_label() + "Mutex LOCK";
+ return SimcallObserver::dot_label() + (blocking_ ? "Mutex LOCK" : "Mutex TRYLOCK");
}
bool MutexLockSimcall::is_enabled() const
{
- return mutex_->get_owner() == nullptr || mutex_->get_owner() == get_issuer();
+ return not blocking_ || mutex_->get_owner() == nullptr || mutex_->get_owner() == get_issuer();
}
} // namespace mc
} // namespace simgrid
std::string dot_label() const override;
};
-class MutexTrylockSimcall : public SimcallObserver {
- kernel::activity::MutexImpl* mutex_;
-
-public:
- MutexTrylockSimcall(smx_actor_t actor, kernel::activity::MutexImpl* mutex) : SimcallObserver(actor), mutex_(mutex) {}
- std::string to_string(int times_considered) const override;
- std::string dot_label() const override;
- kernel::activity::MutexImpl* get_mutex() const { return mutex_; }
-};
-
class MutexLockSimcall : public SimcallObserver {
kernel::activity::MutexImpl* mutex_;
+ bool blocking_;
public:
- MutexLockSimcall(smx_actor_t actor, kernel::activity::MutexImpl* mutex) : SimcallObserver(actor), mutex_(mutex) {}
+ MutexLockSimcall(smx_actor_t actor, kernel::activity::MutexImpl* mutex, bool blocking = true)
+ : SimcallObserver(actor), mutex_(mutex), blocking_(blocking)
+ {
+ }
bool is_enabled() const override;
std::string to_string(int times_considered) const override;
std::string dot_label() const override;
bool Mutex::try_lock()
{
kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
- mc::MutexTrylockSimcall observer{issuer, pimpl_};
+ mc::MutexLockSimcall observer{issuer, pimpl_, false};
return kernel::actor::simcall([&observer] { return observer.get_mutex()->try_lock(observer.get_issuer()); },
&observer);
}