]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tools/ceph-dencoder: do not use singleton of registry
authorKefu Chai <kchai@redhat.com>
Tue, 3 Aug 2021 09:09:03 +0000 (17:09 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 3 Aug 2021 12:51:43 +0000 (20:51 +0800)
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 <kchai@redhat.com>
src/tools/ceph-dencoder/CMakeLists.txt
src/tools/ceph-dencoder/ceph_dencoder.cc
src/tools/ceph-dencoder/common_types.cc
src/tools/ceph-dencoder/denc_registry.cc [deleted file]
src/tools/ceph-dencoder/denc_registry.h
src/tools/ceph-dencoder/mds_types.cc
src/tools/ceph-dencoder/osd_types.cc
src/tools/ceph-dencoder/rbd_types.cc
src/tools/ceph-dencoder/rgw_types.cc

index f5400d9deb1358129673545103ef832066524a44..af767e01360f2192c6f817221ff7b65700872c35 100644 (file)
@@ -9,7 +9,6 @@ if(HAS_VTA)
 endif()
 
 set(dencoder_srcs
-  denc_registry.cc
   ceph_dencoder.cc
   ../../include/uuid.cc
   ../../include/utime.cc
index 31c4497d57ac9d634ef14ec03b6aa81e6e83f1bb..f4abbcd7ca3dbc55f2df87de5d606153f327c90d 100644 (file)
@@ -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<register_dencoders_t>(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<DencoderPlugin> load_plugins()
+vector<DencoderPlugin> 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<DencoderPlugin> 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<DencoderPlugin> 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<const char*> args;
   argv_to_vec(argc, argv, args);
index 86c08c51211c7e40f2e8f1a56d5121c1fb5cf9db..fcd8a1eb4332d7068b7cf63897b6765250a525dc 100644 (file)
@@ -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 (file)
index 0db83af..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "denc_registry.h"
-
-void DencoderRegistry::add(const char* name, std::unique_ptr<Dencoder>&& denc)
-{
-  dencoders.emplace(name, std::move(denc));
-};
-
-DencoderRegistry& DencoderRegistry::instance()
-{
-  static DencoderRegistry registry;
-  return registry;
-}
index a5bc2b261df0d4b0ce68db5c6e44568d159204ed..32a016f6b1702a1422453af0c69a9ea98bf8d3bc 100644 (file)
@@ -226,31 +226,30 @@ public:
 class DencoderRegistry
 {
   using dencoders_t = std::map<std::string, std::unique_ptr<Dencoder>>;
+
 public:
-  void add(const char* name, std::unique_ptr<Dencoder>&& denc);
   dencoders_t& get() {
     return dencoders;
   }
-  static DencoderRegistry& instance();
+
+  template<typename DencoderT, typename...Args>
+  void emplace(const char* name, Args&&...args) {
+    auto dencoder = std::make_unique<DencoderT>(std::forward<Args>(args)...);
+    dencoders.emplace(name, std::move(dencoder));
+  }
+
 private:
   dencoders_t dencoders;
 };
 
-template<typename DencoderT, typename...Args>
-void make_and_register_dencoder(const char* name, Args&&...args)
-{
-  auto dencoder = std::make_unique<DencoderT>(std::forward<Args>(args)...);
-  DencoderRegistry::instance().add(name, std::move(dencoder));
-}
-
-#define TYPE(t) make_and_register_dencoder<DencoderImplNoFeature<t>>(#t, false, false);
-#define TYPE_STRAYDATA(t) make_and_register_dencoder<DencoderImplNoFeature<t>>(#t, true, false);
-#define TYPE_NONDETERMINISTIC(t) make_and_register_dencoder<DencoderImplNoFeature<t>>(#t, false, true);
-#define TYPE_FEATUREFUL(t) make_and_register_dencoder<DencoderImplFeatureful<t>>(#t, false, false);
-#define TYPE_FEATUREFUL_STRAYDATA(t) make_and_register_dencoder<DencoderImplFeatureful<t>>(#t, true, false);
-#define TYPE_FEATUREFUL_NONDETERMINISTIC(t) make_and_register_dencoder<DencoderImplFeatureful<t>>(#t, false, true);
-#define TYPE_FEATUREFUL_NOCOPY(t) make_and_register_dencoder<DencoderImplFeaturefulNoCopy<t>>(#t, false, false);
-#define TYPE_NOCOPY(t) make_and_register_dencoder<DencoderImplNoFeatureNoCopy<t>>(#t, false, false);
-#define MESSAGE(t) make_and_register_dencoder<MessageDencoderImpl<t>>(#t);
+#define TYPE(t) registry.emplace<DencoderImplNoFeature<t>>(#t, false, false);
+#define TYPE_STRAYDATA(t) registry.emplace<DencoderImplNoFeature<t>>(#t, true, false);
+#define TYPE_NONDETERMINISTIC(t) registry.emplace<DencoderImplNoFeature<t>>(#t, false, true);
+#define TYPE_FEATUREFUL(t) registry.emplace<DencoderImplFeatureful<t>>(#t, false, false);
+#define TYPE_FEATUREFUL_STRAYDATA(t) registry.emplace<DencoderImplFeatureful<t>>(#t, true, false);
+#define TYPE_FEATUREFUL_NONDETERMINISTIC(t) registry.emplace<DencoderImplFeatureful<t>>(#t, false, true);
+#define TYPE_FEATUREFUL_NOCOPY(t) registry.emplace<DencoderImplFeaturefulNoCopy<t>>(#t, false, false);
+#define TYPE_NOCOPY(t) registry.emplace<DencoderImplNoFeatureNoCopy<t>>(#t, false, false);
+#define MESSAGE(t) registry.emplace<MessageDencoderImpl<t>>(#t);
 
 #define DENC_API extern "C" [[gnu::visibility("default")]]
index d28306cbf6b9efb91907a841a2192239062ba00f..3254bac62d368eb36d4dcf9e89cdb2bc6f02c088 100644 (file)
@@ -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"
 }
index d21e904b9cc5bcdee894bc90e8ee7c2f489729e4..f7dc1e8d89ddb43b5ec2125094e1b5ff87082a1b 100644 (file)
@@ -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"
 }
index a9ffe74aea5c914716350d18e24fa86c466aea43..361a2a75e295bb9fba06a7141055fb8a21834bcd 100644 (file)
@@ -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"
 }
index de557cda54de7b9d22015f04950fe068d54cbccb..1b8adece4e1d4782b72a9ea7db64644422ea88b6 100644 (file)
@@ -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"
 }