X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9856e530871afa8c75fda68ab7cbc718e9ba7e95..90b0fa923c841996f89a17c252a443a65493fbfc:/src/kernel/actor/SimcallObserver.hpp diff --git a/src/kernel/actor/SimcallObserver.hpp b/src/kernel/actor/SimcallObserver.hpp index 77f94f8de4..4242b2d57d 100644 --- a/src/kernel/actor/SimcallObserver.hpp +++ b/src/kernel/actor/SimcallObserver.hpp @@ -7,6 +7,7 @@ #define SIMGRID_MC_SIMCALL_OBSERVER_HPP #include "simgrid/forward.h" +#include "src/mc/transition/Transition.hpp" #include "xbt/asserts.h" #include @@ -26,7 +27,7 @@ public: * For example, a mutex_lock is not enabled when the mutex is not free. * A comm_receive is not enabled before the corresponding send has been issued. */ - virtual bool is_enabled() const { return true; } + virtual bool is_enabled() { return true; } /** Returns the amount of time that this transition can be used. * @@ -34,7 +35,7 @@ public: * If it's more than one (as with mc_random or waitany), we need to consider this transition several times to start * differing branches */ - virtual int get_max_consider() const { return 1; } + virtual int get_max_consider() { return 1; } /** Prepares the simcall to be used. * @@ -49,24 +50,22 @@ public: { /* Nothing to do by default */ } - /** We need to save the observer of simcalls as they get executed to later compute their dependencies in classical - * DPOR */ - virtual SimcallObserver* clone() = 0; - /** Computes the dependency relation */ virtual bool depends(SimcallObserver* other); + /** Serialize to the given string buffer */ + virtual void serialize(std::stringstream& stream) const; + /** Some simcalls may only be observable under some conditions. * Most simcalls are not visible from the MC because they don't have an observer at all. */ virtual bool is_visible() const { return true; } - virtual std::string to_string(int times_considered) const = 0; - virtual std::string dot_label(int times_considered) const = 0; }; template class ResultingSimcall : public SimcallObserver { T result_; public: + ResultingSimcall() = default; ResultingSimcall(ActorImpl* actor, T default_result) : SimcallObserver(actor), result_(default_result) {} void set_result(T res) { result_ = res; } T get_result() const { return result_; } @@ -82,16 +81,9 @@ public: { xbt_assert(min < max); } - SimcallObserver* clone() override - { - auto res = new RandomSimcall(get_issuer(), min_, max_); - res->next_value_ = next_value_; - return res; - } - int get_max_consider() const override; + void serialize(std::stringstream& stream) const override; + int get_max_consider() override; void prepare(int times_considered) override; - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; int get_value() const { return next_value_; } bool depends(SimcallObserver* other) override; }; @@ -107,11 +99,6 @@ public: class MutexUnlockSimcall : public MutexSimcall { using MutexSimcall::MutexSimcall; - -public: - SimcallObserver* clone() override { return new MutexUnlockSimcall(get_issuer(), get_mutex()); } - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; }; class MutexLockSimcall : public MutexSimcall { @@ -122,10 +109,7 @@ public: : MutexSimcall(actor, mutex), blocking_(blocking) { } - SimcallObserver* clone() override { return new MutexLockSimcall(get_issuer(), get_mutex(), blocking_); } - bool is_enabled() const override; - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; + bool is_enabled() override; }; class ConditionWaitSimcall : public ResultingSimcall { @@ -139,11 +123,8 @@ public: : ResultingSimcall(actor, false), cond_(cond), mutex_(mutex), timeout_(timeout) { } - SimcallObserver* clone() override { return new ConditionWaitSimcall(get_issuer(), cond_, mutex_, timeout_); } - bool is_enabled() const override; + bool is_enabled() override; bool is_visible() const override { return false; } - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; activity::ConditionVariableImpl* get_cond() const { return cond_; } activity::MutexImpl* get_mutex() const { return mutex_; } double get_timeout() const { return timeout_; } @@ -158,11 +139,8 @@ public: : ResultingSimcall(actor, false), sem_(sem), timeout_(timeout) { } - SimcallObserver* clone() override { return new SemAcquireSimcall(get_issuer(), sem_, timeout_); } - bool is_enabled() const override; + bool is_enabled() override; bool is_visible() const override { return false; } - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; activity::SemaphoreImpl* get_sem() const { return sem_; } double get_timeout() const { return timeout_; } }; @@ -175,29 +153,23 @@ public: : ResultingSimcall(actor, true), activity_(activity) { } - SimcallObserver* clone() override { return new ActivityTestSimcall(get_issuer(), activity_); } bool is_visible() const override { return true; } - bool depends(SimcallObserver* other) override; - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; activity::ActivityImpl* get_activity() const { return activity_; } + void serialize(std::stringstream& stream) const override; }; class ActivityTestanySimcall : public ResultingSimcall { const std::vector& activities_; + std::vector indexes_; // indexes in activities_ pointing to ready activities (=whose test() is positive) int next_value_ = 0; public: - ActivityTestanySimcall(ActorImpl* actor, const std::vector& activities) - : ResultingSimcall(actor, -1), activities_(activities) - { - } - SimcallObserver* clone() override { return new ActivityTestanySimcall(get_issuer(), activities_); } + ActivityTestanySimcall(ActorImpl* actor, const std::vector& activities); bool is_visible() const override { return true; } - int get_max_consider() const override; + bool is_enabled() override { return true; /* can return -1 if no activity is ready */ } + void serialize(std::stringstream& stream) const override; + int get_max_consider() override; void prepare(int times_considered) override; - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; const std::vector& get_activities() const { return activities_; } int get_value() const { return next_value_; } }; @@ -211,12 +183,9 @@ public: : ResultingSimcall(actor, false), activity_(activity), timeout_(timeout) { } - SimcallObserver* clone() override { return new ActivityWaitSimcall(get_issuer(), activity_, timeout_); } + void serialize(std::stringstream& stream) const override; bool is_visible() const override { return true; } - bool is_enabled() const override; - bool depends(SimcallObserver* other) override; - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; + bool is_enabled() override; activity::ActivityImpl* get_activity() const { return activity_; } void set_activity(activity::ActivityImpl* activity) { activity_ = activity; } double get_timeout() const { return timeout_; } @@ -224,26 +193,113 @@ public: class ActivityWaitanySimcall : public ResultingSimcall { const std::vector& activities_; + std::vector indexes_; // indexes in activities_ pointing to ready activities (=whose test() is positive) const double timeout_; int next_value_ = 0; public: - ActivityWaitanySimcall(ActorImpl* actor, const std::vector& activities, double timeout) - : ResultingSimcall(actor, -1), activities_(activities), timeout_(timeout) - { - } - SimcallObserver* clone() override { return new ActivityWaitanySimcall(get_issuer(), activities_, timeout_); } - bool is_enabled() const override; + ActivityWaitanySimcall(ActorImpl* actor, const std::vector& activities, double timeout); + bool is_enabled() override; + void serialize(std::stringstream& stream) const override; bool is_visible() const override { return true; } void prepare(int times_considered) override; - int get_max_consider() const override; - std::string to_string(int times_considered) const override; - std::string dot_label(int times_considered) const override; + int get_max_consider() override; const std::vector& get_activities() const { return activities_; } double get_timeout() const { return timeout_; } int get_value() const { return next_value_; } }; +class CommIsendSimcall : public SimcallObserver { + activity::MailboxImpl* mbox_; + double payload_size_; + double rate_; + unsigned char* src_buff_; + size_t src_buff_size_; + void* payload_; + bool detached_; + activity::CommImpl* comm_; + int tag_; + + bool (*match_fun_)(void*, void*, activity::CommImpl*); + void (*clean_fun_)(void*); // used to free the synchro in case of problem after a detached send + void (*copy_data_fun_)(activity::CommImpl*, void*, size_t); // used to copy data if not default one + +public: + CommIsendSimcall(ActorImpl* actor, activity::MailboxImpl* mbox, double payload_size, double rate, + unsigned char* src_buff, size_t src_buff_size, bool (*match_fun)(void*, void*, activity::CommImpl*), + void (*clean_fun)(void*), // used to free the synchro in case of problem after a detached send + void (*copy_data_fun)(activity::CommImpl*, void*, size_t), // used to copy data if not default one + void* payload, bool detached) + : SimcallObserver(actor) + , mbox_(mbox) + , payload_size_(payload_size) + , rate_(rate) + , src_buff_(src_buff) + , src_buff_size_(src_buff_size) + , payload_(payload) + , detached_(detached) + , match_fun_(match_fun) + , clean_fun_(clean_fun) + , copy_data_fun_(copy_data_fun) + { + } + void serialize(std::stringstream& stream) const override; + bool is_visible() const override { return true; } + activity::MailboxImpl* get_mailbox() const { return mbox_; } + double get_payload_size() const { return payload_size_; } + double get_rate() const { return rate_; } + unsigned char* get_src_buff() const { return src_buff_; } + size_t get_src_buff_size() const { return src_buff_size_; } + void* get_payload() const { return payload_; } + bool is_detached() const { return detached_; } + void set_comm(activity::CommImpl* comm) { comm_ = comm; } + void set_tag(int tag) { tag_ = tag; } + + auto get_match_fun() const { return match_fun_; } + auto get_clean_fun() const { return clean_fun_; } + auto get_copy_data_fun() const { return copy_data_fun_; } +}; + +class CommIrecvSimcall : public SimcallObserver { + activity::MailboxImpl* mbox_; + unsigned char* dst_buff_; + size_t* dst_buff_size_; + void* payload_; + double rate_; + int tag_; + activity::CommImpl* comm_; + + bool (*match_fun_)(void*, void*, activity::CommImpl*); + void (*copy_data_fun_)(activity::CommImpl*, void*, size_t); // used to copy data if not default one + +public: + CommIrecvSimcall(ActorImpl* actor, activity::MailboxImpl* mbox, unsigned char* dst_buff, size_t* dst_buff_size, + bool (*match_fun)(void*, void*, activity::CommImpl*), + void (*copy_data_fun)(activity::CommImpl*, void*, size_t), void* payload, double rate) + : SimcallObserver(actor) + , mbox_(mbox) + , dst_buff_(dst_buff) + , dst_buff_size_(dst_buff_size) + , payload_(payload) + , rate_(rate) + , match_fun_(match_fun) + , copy_data_fun_(copy_data_fun) + { + } + void serialize(std::stringstream& stream) const override; + bool is_visible() const override { return true; } + activity::MailboxImpl* get_mailbox() const { return mbox_; } + double get_rate() const { return rate_; } + unsigned char* get_dst_buff() const { return dst_buff_; } + size_t* get_dst_buff_size() const { return dst_buff_size_; } + void* get_payload() const { return payload_; } + void set_comm(activity::CommImpl* comm) { comm_ = comm; } + void set_tag(int tag) { tag_ = tag; } + + auto get_match_fun() const { return match_fun_; }; + auto get_copy_data_fun() const { return copy_data_fun_; } +}; + } // namespace actor } // namespace kernel } // namespace simgrid