#pragma once // Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt #include #include #include #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: NGL::INGLLogger& m_logger; void waitSetTask(); 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) {} }; dds::core::cond::WaitSet m_waitSet; dds::core::cond::GuardCondition m_abortCondition; std::future m_task; std::mutex m_accessMutex; std::map m_waitSetData; }; } // namespace DDSGeneric