From 7c095590b8024197cae5af12b3897c68b425d54f Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 3 Aug 2021 17:09:03 +0800 Subject: [PATCH] tools/ceph-dencoder: do not use singleton of registry instead of defining dencoder registry as a singleton, created it in main(). it's simpler to reason about this way. Signed-off-by: Kefu Chai --- src/tools/ceph-dencoder/CMakeLists.txt | 1 - src/tools/ceph-dencoder/ceph_dencoder.cc | 22 +++++++-------- src/tools/ceph-dencoder/common_types.cc | 2 +- src/tools/ceph-dencoder/denc_registry.cc | 12 -------- src/tools/ceph-dencoder/denc_registry.h | 35 ++++++++++++------------ src/tools/ceph-dencoder/mds_types.cc | 2 +- src/tools/ceph-dencoder/osd_types.cc | 2 +- src/tools/ceph-dencoder/rbd_types.cc | 2 +- src/tools/ceph-dencoder/rgw_types.cc | 2 +- 9 files changed, 33 insertions(+), 47 deletions(-) delete mode 100644 src/tools/ceph-dencoder/denc_registry.cc diff --git a/src/tools/ceph-dencoder/CMakeLists.txt b/src/tools/ceph-dencoder/CMakeLists.txt index f5400d9deb1..af767e01360 100644 --- a/src/tools/ceph-dencoder/CMakeLists.txt +++ b/src/tools/ceph-dencoder/CMakeLists.txt @@ -9,7 +9,6 @@ if(HAS_VTA) endif() set(dencoder_srcs - denc_registry.cc ceph_dencoder.cc ../../include/uuid.cc ../../include/utime.cc diff --git a/src/tools/ceph-dencoder/ceph_dencoder.cc b/src/tools/ceph-dencoder/ceph_dencoder.cc index 31c4497d57a..f4abbcd7ca3 100644 --- a/src/tools/ceph-dencoder/ceph_dencoder.cc +++ b/src/tools/ceph-dencoder/ceph_dencoder.cc @@ -77,18 +77,18 @@ public: } #endif } - int register_dencoders() { + int register_dencoders(DencoderRegistry& registry) { assert(mod); - using register_dencoders_t = void (*)(); - const auto register_dencoders = + using register_dencoders_t = void (*)(DencoderRegistry&); + const auto do_register = reinterpret_cast(dlsym(mod, REGISTER_DENCODERS_FUNCTION.data())); - if (register_dencoders == nullptr) { + if (do_register == nullptr) { std::cerr << "failed to dlsym(" << REGISTER_DENCODERS_FUNCTION << ")" << std::endl; return -1; } - const unsigned nr_before = DencoderRegistry::instance().get().size(); - register_dencoders(); - const unsigned nr_after = DencoderRegistry::instance().get().size(); + const unsigned nr_before = registry.get().size(); + do_register(registry); + const unsigned nr_after = registry.get().size(); return nr_after - nr_before; } bool good() const { @@ -98,7 +98,7 @@ private: void *mod = nullptr; }; -vector load_plugins() +vector load_plugins(DencoderRegistry& registry) { fs::path mod_dir{CEPH_DENC_MOD_DIR}; if (auto ceph_lib = getenv("CEPH_LIB"); ceph_lib) { @@ -121,7 +121,7 @@ vector load_plugins() if (!plugin.good()) { continue; } - int n = plugin.register_dencoders(); + int n = plugin.register_dencoders(registry); if (n <= 0) { std::cerr << "fail to load dencoders from " << entry << std::endl; continue; @@ -133,8 +133,8 @@ vector load_plugins() int main(int argc, const char **argv) { - auto plugins = load_plugins(); - auto& dencoders = DencoderRegistry::instance().get(); + DencoderRegistry registry; + auto plugins = load_plugins(registry); vector args; argv_to_vec(argc, argv, args); diff --git a/src/tools/ceph-dencoder/common_types.cc b/src/tools/ceph-dencoder/common_types.cc index 86c08c51211..fcd8a1eb433 100644 --- a/src/tools/ceph-dencoder/common_types.cc +++ b/src/tools/ceph-dencoder/common_types.cc @@ -25,7 +25,7 @@ using namespace std; #include "denc_registry.h" -DENC_API void register_dencoders() +DENC_API void register_dencoders(DencoderRegistry& registry) { #include "common_types.h" } diff --git a/src/tools/ceph-dencoder/denc_registry.cc b/src/tools/ceph-dencoder/denc_registry.cc deleted file mode 100644 index 0db83af7f79..00000000000 --- a/src/tools/ceph-dencoder/denc_registry.cc +++ /dev/null @@ -1,12 +0,0 @@ -#include "denc_registry.h" - -void DencoderRegistry::add(const char* name, std::unique_ptr&& denc) -{ - dencoders.emplace(name, std::move(denc)); -}; - -DencoderRegistry& DencoderRegistry::instance() -{ - static DencoderRegistry registry; - return registry; -} diff --git a/src/tools/ceph-dencoder/denc_registry.h b/src/tools/ceph-dencoder/denc_registry.h index a5bc2b261df..32a016f6b17 100644 --- a/src/tools/ceph-dencoder/denc_registry.h +++ b/src/tools/ceph-dencoder/denc_registry.h @@ -226,31 +226,30 @@ public: class DencoderRegistry { using dencoders_t = std::map>; + public: - void add(const char* name, std::unique_ptr&& denc); dencoders_t& get() { return dencoders; } - static DencoderRegistry& instance(); + + template + void emplace(const char* name, Args&&...args) { + auto dencoder = std::make_unique(std::forward(args)...); + dencoders.emplace(name, std::move(dencoder)); + } + private: dencoders_t dencoders; }; -template -void make_and_register_dencoder(const char* name, Args&&...args) -{ - auto dencoder = std::make_unique(std::forward(args)...); - DencoderRegistry::instance().add(name, std::move(dencoder)); -} - -#define TYPE(t) make_and_register_dencoder>(#t, false, false); -#define TYPE_STRAYDATA(t) make_and_register_dencoder>(#t, true, false); -#define TYPE_NONDETERMINISTIC(t) make_and_register_dencoder>(#t, false, true); -#define TYPE_FEATUREFUL(t) make_and_register_dencoder>(#t, false, false); -#define TYPE_FEATUREFUL_STRAYDATA(t) make_and_register_dencoder>(#t, true, false); -#define TYPE_FEATUREFUL_NONDETERMINISTIC(t) make_and_register_dencoder>(#t, false, true); -#define TYPE_FEATUREFUL_NOCOPY(t) make_and_register_dencoder>(#t, false, false); -#define TYPE_NOCOPY(t) make_and_register_dencoder>(#t, false, false); -#define MESSAGE(t) make_and_register_dencoder>(#t); +#define TYPE(t) registry.emplace>(#t, false, false); +#define TYPE_STRAYDATA(t) registry.emplace>(#t, true, false); +#define TYPE_NONDETERMINISTIC(t) registry.emplace>(#t, false, true); +#define TYPE_FEATUREFUL(t) registry.emplace>(#t, false, false); +#define TYPE_FEATUREFUL_STRAYDATA(t) registry.emplace>(#t, true, false); +#define TYPE_FEATUREFUL_NONDETERMINISTIC(t) registry.emplace>(#t, false, true); +#define TYPE_FEATUREFUL_NOCOPY(t) registry.emplace>(#t, false, false); +#define TYPE_NOCOPY(t) registry.emplace>(#t, false, false); +#define MESSAGE(t) registry.emplace>(#t); #define DENC_API extern "C" [[gnu::visibility("default")]] diff --git a/src/tools/ceph-dencoder/mds_types.cc b/src/tools/ceph-dencoder/mds_types.cc index d28306cbf6b..3254bac62d3 100644 --- a/src/tools/ceph-dencoder/mds_types.cc +++ b/src/tools/ceph-dencoder/mds_types.cc @@ -25,7 +25,7 @@ using namespace std; #include "denc_registry.h" -DENC_API void register_dencoders() +DENC_API void register_dencoders(DencoderRegistry& registry) { #include "mds_types.h" } diff --git a/src/tools/ceph-dencoder/osd_types.cc b/src/tools/ceph-dencoder/osd_types.cc index d21e904b9cc..f7dc1e8d89d 100644 --- a/src/tools/ceph-dencoder/osd_types.cc +++ b/src/tools/ceph-dencoder/osd_types.cc @@ -28,7 +28,7 @@ using namespace std; // cannot initialize dencoders when initializing static variables, as some of // the types are allocated using mempool, and the mempools are initialized as // static variables. -DENC_API void register_dencoders() +DENC_API void register_dencoders(DencoderRegistry& registry) { #include "osd_types.h" } diff --git a/src/tools/ceph-dencoder/rbd_types.cc b/src/tools/ceph-dencoder/rbd_types.cc index a9ffe74aea5..361a2a75e29 100644 --- a/src/tools/ceph-dencoder/rbd_types.cc +++ b/src/tools/ceph-dencoder/rbd_types.cc @@ -25,7 +25,7 @@ using namespace std; #include "denc_registry.h" -DENC_API void register_dencoders() +DENC_API void register_dencoders(DencoderRegistry& registry) { #include "rbd_types.h" } diff --git a/src/tools/ceph-dencoder/rgw_types.cc b/src/tools/ceph-dencoder/rgw_types.cc index de557cda54d..1b8adece4e1 100644 --- a/src/tools/ceph-dencoder/rgw_types.cc +++ b/src/tools/ceph-dencoder/rgw_types.cc @@ -25,7 +25,7 @@ using namespace std; #include "denc_registry.h" -DENC_API void register_dencoders() +DENC_API void register_dencoders(DencoderRegistry& registry) { #include "rgw_types.h" } -- 2.39.5