1 #include <torch/csrc/monitor/events.h> 2 3 #include <algorithm> 4 #include <mutex> 5 #include <vector> 6 7 namespace torch { 8 namespace monitor { 9 10 namespace { 11 class EventHandlers { 12 public: registerEventHandler(std::shared_ptr<EventHandler> handler)13 void registerEventHandler(std::shared_ptr<EventHandler> handler) noexcept { 14 std::unique_lock<std::mutex> lock(mu_); 15 16 handlers_.emplace_back(std::move(handler)); 17 } 18 unregisterEventHandler(const std::shared_ptr<EventHandler> & handler)19 void unregisterEventHandler( 20 const std::shared_ptr<EventHandler>& handler) noexcept { 21 std::unique_lock<std::mutex> lock(mu_); 22 23 auto it = std::find(handlers_.begin(), handlers_.end(), handler); 24 handlers_.erase(it); 25 } 26 logEvent(const Event & e)27 void logEvent(const Event& e) { 28 std::unique_lock<std::mutex> lock(mu_); 29 30 for (auto& handler : handlers_) { 31 handler->handle(e); 32 } 33 } 34 get()35 static EventHandlers& get() noexcept { 36 static EventHandlers ehs; 37 return ehs; 38 } 39 40 private: 41 std::mutex mu_{}; 42 std::vector<std::shared_ptr<EventHandler>> handlers_{}; 43 }; 44 } // namespace 45 logEvent(const Event & e)46void logEvent(const Event& e) { 47 EventHandlers::get().logEvent(e); 48 } 49 registerEventHandler(std::shared_ptr<EventHandler> p)50void registerEventHandler(std::shared_ptr<EventHandler> p) { 51 EventHandlers::get().registerEventHandler(std::move(p)); 52 } 53 unregisterEventHandler(const std::shared_ptr<EventHandler> & p)54void unregisterEventHandler(const std::shared_ptr<EventHandler>& p) { 55 EventHandlers::get().unregisterEventHandler(p); 56 } 57 58 } // namespace monitor 59 } // namespace torch 60