X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1d1294418fcdb34a66a0569033b173274db14fe8..d236809e6149a03ef3e53599458f51c98f79f94d:/src/kernel/actor/SimcallObserver.cpp diff --git a/src/kernel/actor/SimcallObserver.cpp b/src/kernel/actor/SimcallObserver.cpp index f2818db656..aa457e4fbb 100644 --- a/src/kernel/actor/SimcallObserver.cpp +++ b/src/kernel/actor/SimcallObserver.cpp @@ -28,6 +28,12 @@ bool RandomSimcall::depends(SimcallObserver* other) { return get_issuer() == other->get_issuer(); } +void RandomSimcall::serialize(Simcall& type, std::stringstream& stream) +{ + type = Simcall::RANDOM; + stream << min_ << ' ' << max_; +} + bool MutexSimcall::depends(SimcallObserver* other) { if (dynamic_cast(other) != nullptr) @@ -218,20 +224,17 @@ bool ActivityTestSimcall::depends(SimcallObserver* other) return true; } -void ActivityWaitSimcall::serialize(Simcall& type, char* buffer) +void ActivityWaitSimcall::serialize(Simcall& type, std::stringstream& stream) { - std::stringstream stream; if (auto* comm = dynamic_cast(activity_)) { type = Simcall::COMM_WAIT; - stream << timeout_ << ' ' << comm; + 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() != nullptr ? comm->get_mailbox()->get_id() : 666); + 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()); } } @@ -291,38 +294,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::dot_label(int times_considered) const { std::string res = SimcallObserver::dot_label(times_considered); @@ -374,115 +345,18 @@ void ActivityWaitanySimcall::prepare(int times_considered) next_value_ = times_considered; } -bool CommIsendSimcall::depends(SimcallObserver* other) -{ - 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; -} -void CommIsendSimcall::serialize(Simcall& type, char* buffer) +void CommIsendSimcall::serialize(Simcall& type, std::stringstream& stream) { 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_); } -void CommIrecvSimcall::serialize(Simcall& type, char* buffer) +void CommIrecvSimcall::serialize(Simcall& type, std::stringstream& stream) { 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("; - res += xbt::string_printf("dst=(%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", dst_buff_) - : "(verbose only)"); - res += ", size=" + (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? std::to_string(*dst_buff_size_) - : "(verbose only)"); - res += ")"; - return res; } -*/ } // namespace actor } // namespace kernel