#include #include #include #include namespace torch { namespace monitor { namespace { class EventHandlers { public: void registerEventHandler(std::shared_ptr handler) noexcept { std::unique_lock lock(mu_); handlers_.emplace_back(std::move(handler)); } void unregisterEventHandler( const std::shared_ptr& handler) noexcept { std::unique_lock lock(mu_); auto it = std::find(handlers_.begin(), handlers_.end(), handler); handlers_.erase(it); } void logEvent(const Event& e) { std::unique_lock lock(mu_); for (auto& handler : handlers_) { handler->handle(e); } } static EventHandlers& get() noexcept { static EventHandlers ehs; return ehs; } private: std::mutex mu_{}; std::vector> handlers_{}; }; } // namespace void logEvent(const Event& e) { EventHandlers::get().logEvent(e); } void registerEventHandler(std::shared_ptr p) { EventHandlers::get().registerEventHandler(std::move(p)); } void unregisterEventHandler(const std::shared_ptr& p) { EventHandlers::get().unregisterEventHandler(p); } } // namespace monitor } // namespace torch