xref: /aosp_15_r20/external/pytorch/c10/util/DynamicCounter.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #pragma once
2*da0073e9SAndroid Build Coastguard Worker 
3*da0073e9SAndroid Build Coastguard Worker #include <functional>
4*da0073e9SAndroid Build Coastguard Worker #include <memory>
5*da0073e9SAndroid Build Coastguard Worker #include <string_view>
6*da0073e9SAndroid Build Coastguard Worker 
7*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Macros.h>
8*da0073e9SAndroid Build Coastguard Worker 
9*da0073e9SAndroid Build Coastguard Worker namespace c10::monitor {
10*da0073e9SAndroid Build Coastguard Worker 
11*da0073e9SAndroid Build Coastguard Worker class C10_API DynamicCounter {
12*da0073e9SAndroid Build Coastguard Worker  public:
13*da0073e9SAndroid Build Coastguard Worker   using Callback = std::function<int64_t()>;
14*da0073e9SAndroid Build Coastguard Worker 
15*da0073e9SAndroid Build Coastguard Worker   // Creates a dynamic counter that can be queried at any point in time by
16*da0073e9SAndroid Build Coastguard Worker   // multiple backends. Only one counter with a given key can exist at any point
17*da0073e9SAndroid Build Coastguard Worker   // in time.
18*da0073e9SAndroid Build Coastguard Worker   //
19*da0073e9SAndroid Build Coastguard Worker   // The callback is invoked every time the counter is queried.
20*da0073e9SAndroid Build Coastguard Worker   // The callback must be thread-safe.
21*da0073e9SAndroid Build Coastguard Worker   // The callback must not throw.
22*da0073e9SAndroid Build Coastguard Worker   // The callback must not block.
23*da0073e9SAndroid Build Coastguard Worker   DynamicCounter(std::string_view key, Callback getCounterCallback);
24*da0073e9SAndroid Build Coastguard Worker 
25*da0073e9SAndroid Build Coastguard Worker   // Unregisters the callback.
26*da0073e9SAndroid Build Coastguard Worker   // Waits for all ongoing callback invocations to finish.
27*da0073e9SAndroid Build Coastguard Worker   ~DynamicCounter();
28*da0073e9SAndroid Build Coastguard Worker 
29*da0073e9SAndroid Build Coastguard Worker  private:
30*da0073e9SAndroid Build Coastguard Worker   struct Guard;
31*da0073e9SAndroid Build Coastguard Worker   std::unique_ptr<Guard> guard_;
32*da0073e9SAndroid Build Coastguard Worker };
33*da0073e9SAndroid Build Coastguard Worker 
34*da0073e9SAndroid Build Coastguard Worker namespace detail {
35*da0073e9SAndroid Build Coastguard Worker class DynamicCounterBackendIf {
36*da0073e9SAndroid Build Coastguard Worker  public:
37*da0073e9SAndroid Build Coastguard Worker   virtual ~DynamicCounterBackendIf() = default;
38*da0073e9SAndroid Build Coastguard Worker 
39*da0073e9SAndroid Build Coastguard Worker   virtual void registerCounter(
40*da0073e9SAndroid Build Coastguard Worker       std::string_view key,
41*da0073e9SAndroid Build Coastguard Worker       DynamicCounter::Callback getCounterCallback) = 0;
42*da0073e9SAndroid Build Coastguard Worker   // MUST wait for all ongoing callback invocations to finish
43*da0073e9SAndroid Build Coastguard Worker   virtual void unregisterCounter(std::string_view key) = 0;
44*da0073e9SAndroid Build Coastguard Worker };
45*da0073e9SAndroid Build Coastguard Worker 
46*da0073e9SAndroid Build Coastguard Worker void C10_API
47*da0073e9SAndroid Build Coastguard Worker     registerDynamicCounterBackend(std::unique_ptr<DynamicCounterBackendIf>);
48*da0073e9SAndroid Build Coastguard Worker } // namespace detail
49*da0073e9SAndroid Build Coastguard Worker } // namespace c10::monitor
50