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