From: Kefu Chai Date: Tue, 3 Aug 2021 09:09:03 +0000 (+0800) Subject: tools/ceph-dencoder: do not use singleton of registry X-Git-Tag: v17.1.0~1182^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7c095590b8024197cae5af12b3897c68b425d54f;p=ceph.git 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 --- diff --git a/src/tools/ceph-dencoder/CMakeLists.txt b/src/tools/ceph-dencoder/CMakeLists.txt index f5400d9deb13..af767e01360f 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 31c4497d57ac..f4abbcd7ca3d 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 86c08c51211c..fcd8a1eb4332 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 0db83af7f79b..000000000000 --- 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 a5bc2b261df0..32a016f6b170 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 d28306cbf6b9..3254bac62d36 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 d21e904b9cc5..f7dc1e8d89dd 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 a9ffe74aea5c..361a2a75e295 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 de557cda54de..1b8adece4e1d 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" }