]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge pull request #20273 from adamemerson/wip-any-singleton-will-do
authorKefu Chai <tchaikov@gmail.com>
Wed, 28 Feb 2018 01:21:41 +0000 (09:21 +0800)
committerGitHub <noreply@github.com>
Wed, 28 Feb 2018 01:21:41 +0000 (09:21 +0800)
common: Switch singletons to use immobile_any and cleanups

Reviewed-by: Jesse Williamson <jwilliamson@suse.de>
Reviewed-by: Kefu Chai <kchai@redhat.com>
1  2 
src/common/ceph_context.cc
src/common/ceph_context.h
src/librbd/ImageCtx.cc
src/librbd/Journal.cc
src/test/CMakeLists.txt
src/tools/rbd_mirror/Mirror.cc

Simple merge
index 72d912205695bdc45c46e0733198be5498426b10,1bdef28866cff813097bb705f06e18e9872b94ee..b06f6e067e04de629b1d686dcd716112c593fd41
@@@ -126,23 -136,31 +136,31 @@@ public
    /**
     * process an admin socket command
     */
 -  void do_command(std::string command, cmdmap_t& cmdmap, std::string format,
 -                ceph::bufferlist *out);
 +  void do_command(std::string_view command, const cmdmap_t& cmdmap,
 +                std::string_view format, ceph::bufferlist *out);
  
-   template<typename T>
-   void lookup_or_create_singleton_object(T*& p, const std::string &name) {
-     std::lock_guard<ceph::spinlock> lg(_associated_objs_lock);
-     if (!_associated_objs.count(name)) {
-       p = new T(this);
-       _associated_objs[name] = new TypedSingletonWrapper<T>(p);
-     } else {
-       TypedSingletonWrapper<T> *wrapper =
-         dynamic_cast<TypedSingletonWrapper<T> *>(_associated_objs[name]);
-       assert(wrapper != NULL);
-       p = wrapper->singleton;
+   static constexpr std::size_t largest_singleton = sizeof(void*) * 72;
+   template<typename T, typename... Args>
+   T& lookup_or_create_singleton_object(std::string_view name,
+                                      Args&&... args) {
+     static_assert(sizeof(T) <= largest_singleton,
+                 "Please increase largest singleton.");
+     std::lock_guard lg(associated_objs_lock);
+     std::type_index type = typeid(T);
+     auto i = associated_objs.find(std::make_pair(name, type));
+     if (i == associated_objs.cend()) {
+       i = associated_objs.emplace_hint(
+       i,
+       std::piecewise_construct,
+       std::forward_as_tuple(name, type),
+       std::forward_as_tuple(std::in_place_type<T>,
+                             std::forward<Args>(args)...));
      }
+     return ceph::any_cast<T&>(i->second);
    }
    /**
     * get a crypto handler
     */
Simple merge
Simple merge
Simple merge
Simple merge