X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dc472b7da21b21f1cebacb5d30e4d8176f30a0fd..5843ccab4e336d47ca34f54e68760ac78d242f36:/src/kernel/actor/SimcallObserver.cpp diff --git a/src/kernel/actor/SimcallObserver.cpp b/src/kernel/actor/SimcallObserver.cpp index 11c533045e..3bd6ab97f1 100644 --- a/src/kernel/actor/SimcallObserver.cpp +++ b/src/kernel/actor/SimcallObserver.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2019-2023. 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. */ @@ -7,6 +7,7 @@ #include "simgrid/s4u/Host.hpp" #include "src/kernel/activity/CommImpl.hpp" #include "src/kernel/activity/MailboxImpl.hpp" +#include "src/kernel/activity/MutexImpl.hpp" #include "src/kernel/actor/ActorImpl.hpp" #include "src/mc/mc_config.hpp" @@ -14,19 +15,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_observer, mc, "Logging specific to MC simcall observation"); -namespace simgrid { -namespace kernel { -namespace actor { +namespace simgrid::kernel::actor { -void SimcallObserver::serialize(std::stringstream& stream) const -{ - stream << (short)mc::Transition::Type::UNKNOWN; -} void RandomSimcall::serialize(std::stringstream& stream) const { stream << (short)mc::Transition::Type::RANDOM << ' '; stream << min_ << ' ' << max_; } +std::string RandomSimcall::to_string() const +{ + return "Random(min:" + std::to_string(min_) + " max:" + std::to_string(max_) + ")"; +} void RandomSimcall::prepare(int times_considered) { @@ -34,31 +33,73 @@ void RandomSimcall::prepare(int times_considered) XBT_DEBUG("MC_RANDOM(%d, %d) will return %d after %d times", min_, max_, next_value_, times_considered); } -int RandomSimcall::get_max_consider() +int RandomSimcall::get_max_consider() const { return max_ - min_ + 1; } bool ConditionWaitSimcall::is_enabled() { - static bool warned = false; - if (not warned) { + if (static bool warned = false; not warned) { XBT_INFO("Using condition variables in model-checked code is still experimental. Use at your own risk"); warned = true; } return true; } +void ConditionWaitSimcall::serialize(std::stringstream& stream) const +{ + THROW_UNIMPLEMENTED; +} +std::string ConditionWaitSimcall::to_string() const +{ + return "ConditionWait(cond_id:" + ptr_to_id(get_cond()) + + " mutex_id:" + std::to_string(get_mutex()->get_id()) + ")"; +} -bool SemAcquireSimcall::is_enabled() +ActorJoinSimcall::ActorJoinSimcall(ActorImpl* actor, ActorImpl* other, double timeout) + : SimcallObserver(actor), other_(s4u::ActorPtr(other->get_iface())), timeout_(timeout) { - static bool warned = false; - if (not warned) { - XBT_INFO("Using semaphore in model-checked code is still experimental. Use at your own risk"); - warned = true; - } - return true; +} +bool ActorJoinSimcall::is_enabled() +{ + return other_->get_impl()->wannadie(); +} +void ActorJoinSimcall::serialize(std::stringstream& stream) const +{ + stream << (short)mc::Transition::Type::ACTOR_JOIN << ' '; + stream << other_->get_pid() << ' ' << (timeout_ > 0); +} +std::string ActorJoinSimcall::to_string() const +{ + return "ActorJoin(pid:" + std::to_string(other_->get_pid()) + ")"; +} +void ActorSleepSimcall::serialize(std::stringstream& stream) const +{ + stream << (short)mc::Transition::Type::ACTOR_SLEEP; +} + +std::string ActorSleepSimcall::to_string() const +{ + return "ActorSleep()"; +} + +void ObjectAccessSimcallObserver::serialize(std::stringstream& stream) const +{ + stream << (short)mc::Transition::Type::OBJECT_ACCESS << ' '; + stream << object_ << ' ' << get_owner()->get_pid(); +} +std::string ObjectAccessSimcallObserver::to_string() const +{ + return "ObjectAccess(obj:" + ptr_to_id(object_) + + " owner:" + std::to_string(get_owner()->get_pid()) + ")"; +} +bool ObjectAccessSimcallObserver::is_visible() const +{ + return get_owner() != get_issuer(); +} +ActorImpl* ObjectAccessSimcallObserver::get_owner() const +{ + return object_->simcall_owner_; } -} // namespace actor -} // namespace kernel -} // namespace simgrid +} // namespace simgrid::kernel::actor