1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_TRACEPOINT_PROVIDER_H
5 #define CEPH_TRACEPOINT_PROVIDER_H
7 #include "common/ceph_context.h"
8 #include "common/config_obs.h"
9 #include "common/ceph_mutex.h"
10 #include "include/dlfcn_compat.h"
12 class TracepointProvider
: public md_config_obs_t
{
16 const char *config_key
;
18 Traits(const char *library
, const char *config_key
)
19 : library(library
), config_key(config_key
) {
25 Singleton(CephContext
*cct
, const char *library
, const char *config_key
)
26 : tracepoint_provider(new TracepointProvider(cct
, library
, config_key
)) {
29 delete tracepoint_provider
;
32 inline bool is_enabled() const {
33 return tracepoint_provider
->m_handle
!= nullptr;
36 TracepointProvider
*tracepoint_provider
;
39 template <const Traits
&traits
>
40 class TypedSingleton
: public Singleton
{
42 explicit TypedSingleton(CephContext
*cct
)
43 : Singleton(cct
, traits
.library
, traits
.config_key
) {
47 TracepointProvider(CephContext
*cct
, const char *library
,
48 const char *config_key
);
49 ~TracepointProvider() override
;
51 TracepointProvider(const TracepointProvider
&) = delete;
52 TracepointProvider
operator =(const TracepointProvider
&) = delete;
53 TracepointProvider(TracepointProvider
&&) = delete;
54 TracepointProvider
operator =(TracepointProvider
&&) = delete;
56 template <const Traits
&traits
>
57 static void initialize(CephContext
*cct
) {
59 cct
->lookup_or_create_singleton_object
<TypedSingleton
<traits
>>(
60 traits
.library
, false, cct
);
65 const char** get_tracked_conf_keys() const override
{
68 void handle_conf_change(const ConfigProxy
& conf
,
69 const std::set
<std::string
> &changed
) override
;
73 std::string m_library
;
74 mutable const char* m_config_keys
[2];
76 ceph::mutex m_lock
= ceph::make_mutex("TracepointProvider::m_lock");
77 void* m_handle
= nullptr;
79 void verify_config(const ConfigProxy
& conf
);
82 #endif // CEPH_TRACEPOINT_PROVIDER_H