]> git.proxmox.com Git - ceph.git/blame - ceph/src/common/TracepointProvider.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / common / TracepointProvider.h
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#ifndef CEPH_TRACEPOINT_PROVIDER_H
5#define CEPH_TRACEPOINT_PROVIDER_H
6
11fdf7f2 7#include "common/ceph_context.h"
7c673cae 8#include "common/config_obs.h"
11fdf7f2 9#include "common/ceph_mutex.h"
7c673cae 10#include <dlfcn.h>
7c673cae 11
11fdf7f2 12class TracepointProvider : public md_config_obs_t {
7c673cae
FG
13public:
14 struct Traits {
15 const char *library;
16 const char *config_key;
17
18 Traits(const char *library, const char *config_key)
19 : library(library), config_key(config_key) {
20 }
21 };
22
23 class Singleton {
24 public:
25 Singleton(CephContext *cct, const char *library, const char *config_key)
26 : tracepoint_provider(new TracepointProvider(cct, library, config_key)) {
27 }
28 ~Singleton() {
29 delete tracepoint_provider;
30 }
31
32 inline bool is_enabled() const {
33 return tracepoint_provider->m_handle != nullptr;
34 }
35 private:
36 TracepointProvider *tracepoint_provider;
37 };
38
39 template <const Traits &traits>
40 class TypedSingleton : public Singleton {
41 public:
42 explicit TypedSingleton(CephContext *cct)
43 : Singleton(cct, traits.library, traits.config_key) {
44 }
45 };
46
47 TracepointProvider(CephContext *cct, const char *library,
48 const char *config_key);
49 ~TracepointProvider() override;
50
11fdf7f2
TL
51 TracepointProvider(const TracepointProvider&) = delete;
52 TracepointProvider operator =(const TracepointProvider&) = delete;
53 TracepointProvider(TracepointProvider&&) = delete;
54 TracepointProvider operator =(TracepointProvider&&) = delete;
55
7c673cae
FG
56 template <const Traits &traits>
57 static void initialize(CephContext *cct) {
58#ifdef WITH_LTTNG
11fdf7f2
TL
59 cct->lookup_or_create_singleton_object<TypedSingleton<traits>>(
60 traits.library, false, cct);
7c673cae
FG
61#endif
62 }
63
64protected:
65 const char** get_tracked_conf_keys() const override {
66 return m_config_keys;
67 }
11fdf7f2
TL
68 void handle_conf_change(const ConfigProxy& conf,
69 const std::set <std::string> &changed) override;
7c673cae
FG
70
71private:
72 CephContext *m_cct;
73 std::string m_library;
74 mutable const char* m_config_keys[2];
75
11fdf7f2 76 ceph::mutex m_lock = ceph::make_mutex("TracepointProvider::m_lock");
7c673cae
FG
77 void* m_handle = nullptr;
78
11fdf7f2 79 void verify_config(const ConfigProxy& conf);
7c673cae
FG
80};
81
82#endif // CEPH_TRACEPOINT_PROVIDER_H