#pragma once #include #include #include #include #include #include namespace NGL { class INGLLogger; } namespace DDSGeneric { class DDSGEN_EXPORT WaitSetHandler final { public: class CallbackInterface { public: virtual ~CallbackInterface() = default; virtual void dataAvailable() = 0; }; WaitSetHandler(); ~WaitSetHandler(); bool attachWaitSet(const dds::core::cond::Condition &cond, CallbackInterface *cb); bool detachWaitSet(const dds::core::cond::Condition &cond, CallbackInterface *cb); bool enableWaitSet(const dds::core::cond::Condition &cond, CallbackInterface *cb); bool disableWaitSet(const dds::core::cond::Condition &cond, CallbackInterface *cb); int attachedConditionCount() const; private: struct WaitSetData final { dds::core::cond::Condition condition; CallbackInterface *callback = nullptr; bool enabled = true; bool needWaitSetAttach = false; WaitSetData(const dds::core::cond::Condition &cond, CallbackInterface *cb) : condition(cond) , callback(cb) {} }; private: void waitSetTask(); private: dds::core::cond::WaitSet m_waitSet; dds::core::cond::GuardCondition m_abortCondition; std::future m_task; std::mutex m_accessMutex; std::map m_waitSetData; NGL::INGLLogger &m_logger; }; }