X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f05d4e0b1657f5cbb15fa2932c7d4a194f3804d9..f9b13d923d31bb0336aeeaab6d5b7ba33812f3f7:/src/kernel/actor/SimcallObserver.cpp?ds=sidebyside diff --git a/src/kernel/actor/SimcallObserver.cpp b/src/kernel/actor/SimcallObserver.cpp index d0dfbd6546..8a9287cc5d 100644 --- a/src/kernel/actor/SimcallObserver.cpp +++ b/src/kernel/actor/SimcallObserver.cpp @@ -6,10 +6,13 @@ #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" +#include + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_observer, mc, "Logging specific to MC simcall observation"); namespace simgrid { @@ -25,6 +28,15 @@ bool RandomSimcall::depends(SimcallObserver* other) { return get_issuer() == other->get_issuer(); } +void RandomSimcall::serialize(Simcall& type, char* buffer) +{ + type = Simcall::RANDOM; + std::stringstream stream; + + stream << min_ << ' ' << max_; + strcpy(buffer, stream.str().c_str()); +} + bool MutexSimcall::depends(SimcallObserver* other) { if (dynamic_cast(other) != nullptr) @@ -48,11 +60,12 @@ bool MutexSimcall::depends(SimcallObserver* other) return true; // Depend on things we don't know for sure that they are independent } -std::string SimcallObserver::to_string(int /*times_considered*/) const +/* +std::string SimcallObserver::to_string(int) const { return simgrid::xbt::string_printf("[(%ld)%s (%s)] ", issuer_->get_pid(), issuer_->get_host()->get_cname(), issuer_->get_cname()); -} +}*/ std::string SimcallObserver::dot_label(int /*times_considered*/) const { @@ -61,11 +74,6 @@ std::string SimcallObserver::dot_label(int /*times_considered*/) const return xbt::string_printf("[(%ld)] ", issuer_->get_pid()); } -std::string RandomSimcall::to_string(int times_considered) const -{ - return SimcallObserver::to_string(times_considered) + "MC_RANDOM(" + std::to_string(times_considered) + ")"; -} - std::string RandomSimcall::dot_label(int times_considered) const { return SimcallObserver::dot_label(times_considered) + "MC_RANDOM(" + std::to_string(next_value_) + ")"; @@ -82,16 +90,12 @@ int RandomSimcall::get_max_consider() const return max_ - min_ + 1; } -std::string MutexUnlockSimcall::to_string(int times_considered) const -{ - return SimcallObserver::to_string(times_considered) + "Mutex UNLOCK"; -} - std::string MutexUnlockSimcall::dot_label(int times_considered) const { return SimcallObserver::dot_label(times_considered) + "Mutex UNLOCK"; } +/* std::string MutexLockSimcall::to_string(int times_considered) const { auto mutex = get_mutex(); @@ -100,7 +104,7 @@ std::string MutexLockSimcall::to_string(int times_considered) const res += ", owner = " + std::to_string(mutex->get_owner() ? mutex->get_owner()->get_pid() : -1); res += ", sleeping = n/a)"; return res; -} +}*/ std::string MutexLockSimcall::dot_label(int times_considered) const { @@ -112,13 +116,6 @@ bool MutexLockSimcall::is_enabled() const return not blocking_ || get_mutex()->get_owner() == nullptr || get_mutex()->get_owner() == get_issuer(); } -std::string ConditionWaitSimcall::to_string(int times_considered) const -{ - std::string res = SimcallObserver::to_string(times_considered) + "Condition WAIT"; - res += "(" + (timeout_ == -1.0 ? "" : std::to_string(timeout_)) + ")"; - return res; -} - std::string ConditionWaitSimcall::dot_label(int times_considered) const { return SimcallObserver::dot_label(times_considered) + "Condition WAIT"; @@ -134,13 +131,6 @@ bool ConditionWaitSimcall::is_enabled() const return true; } -std::string SemAcquireSimcall::to_string(int times_considered) const -{ - std::string res = SimcallObserver::to_string(times_considered) + "Sem ACQUIRE"; - res += "(" + (timeout_ == -1.0 ? "" : std::to_string(timeout_)) + ")"; - return res; -} - std::string SemAcquireSimcall::dot_label(int times_considered) const { return SimcallObserver::dot_label(times_considered) + "Sem ACQUIRE"; @@ -172,6 +162,7 @@ void ActivityTestanySimcall::prepare(int times_considered) next_value_ = times_considered; } +/* std::string ActivityTestanySimcall::to_string(int times_considered) const { std::string res = SimcallObserver::to_string(times_considered); @@ -182,7 +173,7 @@ std::string ActivityTestanySimcall::to_string(int times_considered) const } return res; -} +}*/ std::string ActivityTestanySimcall::dot_label(int times_considered) const { @@ -236,12 +227,28 @@ bool ActivityTestSimcall::depends(SimcallObserver* other) return true; } +void ActivityWaitSimcall::serialize(Simcall& type, char* buffer) +{ + std::stringstream stream; + if (auto* comm = dynamic_cast(activity_)) { + type = Simcall::COMM_WAIT; + stream << (timeout_ > 0) << ' ' << comm; + stream << ' ' << (comm->src_actor_ != nullptr ? comm->src_actor_->get_pid() : -1); + stream << ' ' << (comm->dst_actor_ != nullptr ? comm->dst_actor_->get_pid() : -1); + stream << ' ' << comm->get_mailbox_id(); + stream << ' ' << (void*)comm->src_buff_ << ' ' << (void*)comm->dst_buff_ << ' ' << comm->src_buff_size_; + strcpy(buffer, stream.str().c_str()); + } else { + type = Simcall::UNKNOWN; + strcpy(buffer, stream.str().c_str()); + } +} +/* std::string ActivityTestSimcall::to_string(int times_considered) const { std::string res = SimcallObserver::to_string(times_considered) + "Test "; - auto* comm = dynamic_cast(activity_); - if (comm) { + if (const auto* comm = dynamic_cast(activity_)) { if (comm->src_actor_.get() == nullptr || comm->dst_actor_.get() == nullptr) { res += "FALSE(comm="; res += XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? xbt::string_printf("%p)", comm) @@ -260,7 +267,7 @@ std::string ActivityTestSimcall::to_string(int times_considered) const } else xbt_die("Only Comms are supported here for now"); return res; -} +}*/ std::string ActivityTestSimcall::dot_label(int times_considered) const { @@ -293,64 +300,6 @@ bool ActivityWaitSimcall::is_enabled() const return (comm->src_actor_ && comm->dst_actor_); } -bool ActivityWaitSimcall::depends(SimcallObserver* other) -{ - if (get_issuer() == other->get_issuer()) - return false; - - if (auto* isend = dynamic_cast(other)) - return isend->depends(this); - - if (auto* irecv = dynamic_cast(other)) - return irecv->depends(this); - - /* Timeouts in wait transitions are not considered by the independence theorem, thus assumed dependent */ - if (const auto* wait = dynamic_cast(other)) { - if (timeout_ > 0 || wait->get_timeout() > 0) - return true; - const auto* comm1 = dynamic_cast(activity_); - const auto* comm2 = dynamic_cast(wait->get_activity()); - - if (comm1 == nullptr || comm2 == nullptr) // One wait at least in not on a Comm - return true; - - if (comm1->src_buff_ == comm2->src_buff_ && comm1->dst_buff_ == comm2->dst_buff_) - return false; - if (comm1->src_buff_ != nullptr && comm1->dst_buff_ != nullptr && comm2->src_buff_ != nullptr && - comm2->dst_buff_ != nullptr && comm1->dst_buff_ != comm2->src_buff_ && comm1->dst_buff_ != comm2->dst_buff_ && - comm2->dst_buff_ != comm1->src_buff_) - return false; - } - - return true; -} - -std::string ActivityWaitSimcall::to_string(int times_considered) const -{ - std::string res = SimcallObserver::to_string(times_considered); - auto* comm = dynamic_cast(activity_); - if (comm == nullptr) { - res += "ActivityWait on non-Comm (FIXME)"; // FIXME - return res; - } - - if (times_considered == -1) { - res += "WaitTimeout(comm=" + (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) - ? xbt::string_printf("%p)", comm) - : "(verbose only))"); - } else { - res += "Wait(comm="; - - auto src = comm->src_actor_; - auto dst = comm->dst_actor_; - res += - XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? xbt::string_printf("%p", comm) : "(verbose only) "; - res += xbt::string_printf("[(%ld)%s (%s) ", src->get_pid(), src->get_host()->get_cname(), src->get_cname()) + - "-> " + xbt::string_printf("(%ld)%s (%s)])", dst->get_pid(), dst->get_host()->get_cname(), dst->get_cname()); - } - return res; -} - std::string ActivityWaitSimcall::dot_label(int times_considered) const { std::string res = SimcallObserver::dot_label(times_considered); @@ -402,116 +351,25 @@ void ActivityWaitanySimcall::prepare(int times_considered) next_value_ = times_considered; } -std::string ActivityWaitanySimcall::to_string(int times_considered) const -{ - std::string res = SimcallObserver::to_string(times_considered) + "WaitAny("; - size_t count = activities_.size(); - if (count > 0) { - if (auto* comm = dynamic_cast(activities_[times_considered])) - res += "comm=" + - (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? xbt::string_printf("%p", comm) - : "(verbose only)") + - xbt::string_printf("(%d of %zu))", times_considered + 1, count); - else - xbt_die("Only Comms are supported here for now"); - } else - res += "comm at idx " + std::to_string(times_considered) + ")"; - return res; -} - -bool CommIsendSimcall::depends(SimcallObserver* other) +void CommIsendSimcall::serialize(Simcall& type, char* buffer) { - if (get_issuer() == other->get_issuer()) - return false; - - if (const auto* other_isend = dynamic_cast(other)) - return mbox_ == other_isend->get_mailbox(); - - // FIXME: Not in the former dependency check because of the ordering but seems logical to add it - if (dynamic_cast(other) != nullptr) - return false; - -#if SIMGRID_HAVE_MC // FIXME needed to access mbox_cpy - if (const auto* wait = dynamic_cast(other)) { - if (const auto* comm2 = dynamic_cast(wait->get_activity())) { // this is a Comm::wait_for - const auto* mbox1 = mbox_; - const auto* mbox2 = comm2->mbox_cpy; - - if (mbox1 != mbox2 && wait->get_timeout() <= 0) - return false; - - if ((get_issuer() != comm2->src_actor_.get()) && (get_issuer() != comm2->dst_actor_.get()) && - wait->get_timeout() <= 0) - return false; - - if (comm2->type_ == activity::CommImpl::Type::SEND && comm2->src_buff_ != src_buff_ && wait->get_timeout() <= 0) - return false; - } - } -#endif - /* FIXME: the following rule assumes that the result of the isend/irecv call is not stored in a buffer used in the - * test call. */ -#if 0 - if (dynamic_cast(other)) - return false; -#endif - - return true; + type = Simcall::ISEND; + std::stringstream stream; + stream << mbox_->get_id() << ' ' << (void*)src_buff_ << ' ' << src_buff_size_; + strcpy(buffer, stream.str().c_str()); + XBT_DEBUG("SendObserver mbox:%u buff:%p size:%zu", mbox_->get_id(), src_buff_, src_buff_size_); } -std::string CommIsendSimcall::to_string(int times_considered) const +void CommIrecvSimcall::serialize(Simcall& type, char* buffer) { - std::string res = SimcallObserver::to_string(times_considered) + "iSend("; - res += xbt::string_printf("src=(%ld)%s (%s)", get_issuer()->get_pid(), get_issuer()->get_host()->get_cname(), - get_issuer()->get_cname()); - res += ", buff=" + (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? xbt::string_printf("%p", src_buff_) - : "(verbose only)"); - res += ", size=" + - (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? std::to_string(src_buff_size_) : "(verbose only)"); - res += ")"; - return res; + type = Simcall::IRECV; + std::stringstream stream; + stream << mbox_->get_id() << dst_buff_; + strcpy(buffer, stream.str().c_str()); } -bool CommIrecvSimcall::depends(SimcallObserver* other) -{ - if (get_issuer() == other->get_issuer()) - return false; - - if (const auto* other_irecv = dynamic_cast(other)) - return mbox_ == other_irecv->get_mailbox(); - - if (auto* isend = dynamic_cast(other)) - return isend->depends(this); - -#if SIMGRID_HAVE_MC // FIXME needed to access mbox_cpy - if (auto* wait = dynamic_cast(other)) { - if (auto* comm2 = dynamic_cast(wait->get_activity())) { // this is a Comm::wait_for - const auto* mbox1 = mbox_; - const auto* mbox2 = comm2->mbox_cpy; - - if (mbox1 != mbox2 && wait->get_timeout() <= 0) - return false; - - if ((get_issuer() != comm2->src_actor_.get()) && (get_issuer() != comm2->dst_actor_.get()) && - wait->get_timeout() <= 0) - return false; - - if (comm2->type_ == activity::CommImpl::Type::RECEIVE && comm2->dst_buff_ != dst_buff_ && - wait->get_timeout() <= 0) - return false; - } - } -#endif - /* FIXME: the following rule assumes that the result of the isend/irecv call is not stored in a buffer used in the - * test call. */ -#if 0 - if (dynamic_cast(other)) - return false; -#endif - - return true; -} +/* std::string CommIrecvSimcall::to_string(int times_considered) const { std::string res = SimcallObserver::to_string(times_considered) + "iRecv("; @@ -524,6 +382,7 @@ std::string CommIrecvSimcall::to_string(int times_considered) const res += ")"; return res; } +*/ } // namespace actor } // namespace kernel