xref: /aosp_15_r20/external/pytorch/torch/csrc/monitor/events.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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)46 void logEvent(const Event& e) {
47   EventHandlers::get().logEvent(e);
48 }
49 
registerEventHandler(std::shared_ptr<EventHandler> p)50 void registerEventHandler(std::shared_ptr<EventHandler> p) {
51   EventHandlers::get().registerEventHandler(std::move(p));
52 }
53 
unregisterEventHandler(const std::shared_ptr<EventHandler> & p)54 void unregisterEventHandler(const std::shared_ptr<EventHandler>& p) {
55   EventHandlers::get().unregisterEventHandler(p);
56 }
57 
58 } // namespace monitor
59 } // namespace torch
60