49 lines
1.3 KiB
C++
49 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <string_view>
|
|
|
|
#include <c10/macros/Macros.h>
|
|
|
|
namespace c10::monitor {
|
|
|
|
class C10_API DynamicCounter {
|
|
public:
|
|
using Callback = std::function<int64_t()>;
|
|
|
|
// Creates a dynamic counter that can be queried at any point in time by
|
|
// multiple backends. Only one counter with a given key can exist at any point
|
|
// in time.
|
|
//
|
|
// The callback is invoked every time the counter is queried.
|
|
// The callback must be thread-safe.
|
|
// The callback must not throw.
|
|
// The callback must not block.
|
|
DynamicCounter(std::string_view key, Callback getCounterCallback);
|
|
|
|
// Unregisters the callback.
|
|
// Waits for all ongoing callback invocations to finish.
|
|
~DynamicCounter();
|
|
|
|
private:
|
|
struct Guard;
|
|
std::unique_ptr<Guard> guard_;
|
|
};
|
|
|
|
namespace detail {
|
|
class DynamicCounterBackendIf {
|
|
public:
|
|
virtual ~DynamicCounterBackendIf() = default;
|
|
|
|
virtual void registerCounter(
|
|
std::string_view key,
|
|
DynamicCounter::Callback getCounterCallback) = 0;
|
|
// MUST wait for all ongoing callback invocations to finish
|
|
virtual void unregisterCounter(std::string_view key) = 0;
|
|
};
|
|
|
|
void C10_API
|
|
registerDynamicCounterBackend(std::unique_ptr<DynamicCounterBackendIf>);
|
|
} // namespace detail
|
|
} // namespace c10::monitor
|