X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/554255fe3f311a54df171d31a4a27f4004840f59..35a644bdf9d0c5603c9483f03f913e4a649638d6:/src/kernel/actor/SimcallObserver.cpp diff --git a/src/kernel/actor/SimcallObserver.cpp b/src/kernel/actor/SimcallObserver.cpp index 94e8a31d6f..d7657a4bcd 100644 --- a/src/kernel/actor/SimcallObserver.cpp +++ b/src/kernel/actor/SimcallObserver.cpp @@ -1,40 +1,30 @@ -/* Copyright (c) 2019-2021. 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. */ #include "src/kernel/actor/SimcallObserver.hpp" #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" -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_observer, mc, "Logging specific to MC simcall observation"); - -namespace simgrid { -namespace kernel { -namespace actor { +#include -std::string SimcallObserver::to_string(int /*time_considered*/) const -{ - return simgrid::xbt::string_printf("[(%ld)%s (%s)] ", issuer_->get_pid(), issuer_->get_host()->get_cname(), - issuer_->get_cname()); -} +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_observer, mc, "Logging specific to MC simcall observation"); -std::string SimcallObserver::dot_label() const -{ - if (issuer_->get_host()) - return xbt::string_printf("[(%ld)%s] ", issuer_->get_pid(), issuer_->get_cname()); - return xbt::string_printf("[(%ld)] ", issuer_->get_pid()); -} +namespace simgrid::kernel::actor { -std::string RandomSimcall::to_string(int time_considered) const +void RandomSimcall::serialize(std::stringstream& stream) const { - return SimcallObserver::to_string(time_considered) + "MC_RANDOM(" + std::to_string(time_considered) + ")"; + stream << (short)mc::Transition::Type::RANDOM << ' '; + stream << min_ << ' ' << max_; } - -std::string RandomSimcall::dot_label() const +std::string RandomSimcall::to_string() const { - return SimcallObserver::dot_label() + "MC_RANDOM(" + std::to_string(next_value_) + ")"; + return "Random(min:" + std::to_string(min_) + " max:" + std::to_string(max_) + ")"; } void RandomSimcall::prepare(int times_considered) @@ -48,90 +38,50 @@ int RandomSimcall::get_max_consider() const return max_ - min_ + 1; } -std::string MutexUnlockSimcall::to_string(int time_considered) const +ActorJoinSimcall::ActorJoinSimcall(ActorImpl* actor, ActorImpl* other, double timeout) + : SimcallObserver(actor), other_(s4u::ActorPtr(other->get_iface())), timeout_(timeout) { - return SimcallObserver::to_string(time_considered) + "Mutex UNLOCK"; } - -std::string MutexUnlockSimcall::dot_label() const +bool ActorJoinSimcall::is_enabled() { - return SimcallObserver::dot_label() + "Mutex UNLOCK"; + return other_->get_impl()->wannadie(); } - -std::string MutexLockSimcall::to_string(int time_considered) const +void ActorJoinSimcall::serialize(std::stringstream& stream) const { - 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)"; - return res; + stream << (short)mc::Transition::Type::ACTOR_JOIN << ' '; + stream << other_->get_pid() << ' ' << (timeout_ > 0); } - -std::string MutexLockSimcall::dot_label() const +std::string ActorJoinSimcall::to_string() const { - return SimcallObserver::dot_label() + (blocking_ ? "Mutex LOCK" : "Mutex TRYLOCK"); + return "ActorJoin(pid:" + std::to_string(other_->get_pid()) + ")"; } - -bool MutexLockSimcall::is_enabled() const +void ActorSleepSimcall::serialize(std::stringstream& stream) const { - return not blocking_ || mutex_->get_owner() == nullptr || mutex_->get_owner() == get_issuer(); + stream << (short)mc::Transition::Type::ACTOR_SLEEP; } -std::string ConditionWaitSimcall::to_string(int time_considered) const +std::string ActorSleepSimcall::to_string() const { - std::string res = SimcallObserver::to_string(time_considered) + "Condition WAIT"; - res += "(" + (timeout_ == -1.0 ? "" : std::to_string(timeout_)) + ")"; - return res; + return "ActorSleep()"; } -std::string ConditionWaitSimcall::dot_label() const +void ObjectAccessSimcallObserver::serialize(std::stringstream& stream) const { - return SimcallObserver::dot_label() + "Condition WAIT"; + stream << (short)mc::Transition::Type::OBJECT_ACCESS << ' '; + stream << object_ << ' ' << get_owner()->get_pid(); } - -bool ConditionWaitSimcall::is_enabled() const -{ - static bool warned = false; - if (not warned) { - XBT_INFO("Using condition variables in model-checked code is still experimental. Use at your own risk"); - warned = true; - } - return true; -} - -std::string SemAcquireSimcall::to_string(int time_considered) const +std::string ObjectAccessSimcallObserver::to_string() const { - std::string res = SimcallObserver::to_string(time_considered) + "Sem ACQUIRE"; - res += "(" + (timeout_ == -1.0 ? "" : std::to_string(timeout_)) + ")"; - return res; + return "ObjectAccess(obj:" + ptr_to_id(object_) + + " owner:" + std::to_string(get_owner()->get_pid()) + ")"; } - -std::string SemAcquireSimcall::dot_label() const +bool ObjectAccessSimcallObserver::is_visible() const { - return SimcallObserver::dot_label() + "Sem ACQUIRE"; + return get_owner() != get_issuer(); } - -bool SemAcquireSimcall::is_enabled() const +ActorImpl* ObjectAccessSimcallObserver::get_owner() const { - 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; + return object_->simcall_owner_; } -std::string ExecutionWaitanySimcall::to_string(int time_considered) const -{ - std::string res = SimcallObserver::to_string(time_considered) + "Execution WAITANY"; - res += "(" + (timeout_ == -1.0 ? "" : std::to_string(timeout_)) + ")"; - return res; -} - -std::string ExecutionWaitanySimcall::dot_label() const -{ - return SimcallObserver::dot_label() + "Execution WAITANY"; -} -} // namespace actor -} // namespace kernel -} // namespace simgrid +} // namespace simgrid::kernel::actor