+};
+
+/* This observer is used for SEM_LOCK and SEM_UNLOCK (only) */
+class SemaphoreObserver final : public SimcallObserver {
+ mc::Transition::Type type_;
+ activity::SemaphoreImpl* const sem_;
+
+public:
+ SemaphoreObserver(ActorImpl* actor, mc::Transition::Type type, activity::SemaphoreImpl* sem);
+
+ void serialize(std::stringstream& stream) const override;
+ std::string to_string() const override;
+
+ activity::SemaphoreImpl* get_sem() const { return sem_; }
+};
+
+/* This observer is ued for SEM_WAIT, that is returning and needs the acquisition (in MC mode) */
+class SemaphoreAcquisitionObserver final : public ResultingSimcall<bool> {
+ mc::Transition::Type type_;
+ activity::SemAcquisitionImpl* const acquisition_;
+ const double timeout_;
+
+public:
+ SemaphoreAcquisitionObserver(ActorImpl* actor, mc::Transition::Type type, activity::SemAcquisitionImpl* acqui,
+ double timeout = -1.0);
+
+ void serialize(std::stringstream& stream) const override;
+ std::string to_string() const override;
+ bool is_enabled() override;
+
+ double get_timeout() const { return timeout_; }
+};
+
+/* This observer is used for BARRIER_LOCK and BARRIER_WAIT. WAIT is returning and needs the acquisition */
+class BarrierObserver final : public ResultingSimcall<bool> {
+ mc::Transition::Type type_;
+ activity::BarrierImpl* const barrier_ = nullptr;
+ activity::BarrierAcquisitionImpl* const acquisition_ = nullptr;
+ const double timeout_;
+
+public:
+ BarrierObserver(ActorImpl* actor, mc::Transition::Type type, activity::BarrierImpl* bar);
+ BarrierObserver(ActorImpl* actor, mc::Transition::Type type, activity::BarrierAcquisitionImpl* acqui,
+ double timeout = -1.0);
+
+ void serialize(std::stringstream& stream) const override;
+ std::string to_string() const override;
+ bool is_enabled() override;
+
+ double get_timeout() const { return timeout_; }
+};
+
+class ConditionWaitSimcall final : public ResultingSimcall<bool> {
+ mc::Transition::Type type_;
+ activity::ConditionVariableImpl* const cond_;
+ activity::MutexImpl* const mutex_;
+ const double timeout_;
+
+public:
+ ConditionWaitSimcall(ActorImpl* actor, activity::ConditionVariableImpl* cond, activity::MutexImpl* mutex,
+ double timeout = -1.0)
+ : ResultingSimcall(actor, false), cond_(cond), mutex_(mutex), timeout_(timeout)
+ {
+ }
+ void serialize(std::stringstream& stream) const override;
+ std::string to_string() const override;