X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bb60211deea857d1f67b2613bc34f38babaeb53b..38f246c4c46920a78ea0af8233449f402c178f04:/src/kernel/actor/SimcallObserver.cpp diff --git a/src/kernel/actor/SimcallObserver.cpp b/src/kernel/actor/SimcallObserver.cpp index 11e9e2ce6f..8ecb3ee221 100644 --- a/src/kernel/actor/SimcallObserver.cpp +++ b/src/kernel/actor/SimcallObserver.cpp @@ -14,6 +14,38 @@ namespace simgrid { namespace kernel { namespace actor { +bool SimcallObserver::depends(SimcallObserver* other) +{ + THROW_UNIMPLEMENTED; +} +/* Random is only dependent when issued by the same actor (ie, always independent) */ +bool RandomSimcall::depends(SimcallObserver* other) +{ + return get_issuer() == other->get_issuer(); +} +bool MutexSimcall::depends(SimcallObserver* other) +{ + if (dynamic_cast(other) != nullptr) + return other->depends(this); /* Other is random, that is very permissive. Use that relation instead. */ + +#if 0 /* This code is currently broken and shouldn't be used. We must implement asynchronous locks before */ + MutexSimcall* that = dynamic_cast(other); + if (that == nullptr) + return true; // Depends on anything we don't know + + /* Theorem 4.4.7: Any pair of synchronization actions of distinct actors concerning distinct mutexes are independent */ + if (this->get_issuer() != that->get_issuer() && this->get_mutex() != that->get_mutex()) + return false; + + /* Theorem 4.4.8 An AsyncMutexLock is independent with a MutexUnlock of another actor */ + if (((dynamic_cast(this) != nullptr && dynamic_cast(that)) || + (dynamic_cast(that) != nullptr && dynamic_cast(this))) && + get_issuer() != other->get_issuer()) + return false; +#endif + return true; // Depend on things we don't know for sure that they are independent +} + std::string SimcallObserver::to_string(int /*times_considered*/) const { return simgrid::xbt::string_printf("[(%ld)%s (%s)] ", issuer_->get_pid(), issuer_->get_host()->get_cname(), @@ -60,9 +92,10 @@ std::string MutexUnlockSimcall::dot_label() const std::string MutexLockSimcall::to_string(int times_considered) const { + auto mutex = get_mutex(); std::string res = SimcallObserver::to_string(times_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 += "(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; } @@ -74,7 +107,7 @@ std::string MutexLockSimcall::dot_label() const bool MutexLockSimcall::is_enabled() const { - return not blocking_ || mutex_->get_owner() == nullptr || mutex_->get_owner() == get_issuer(); + return not blocking_ || get_mutex()->get_owner() == nullptr || get_mutex()->get_owner() == get_issuer(); } std::string ConditionWaitSimcall::to_string(int times_considered) const