/**
* 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
*/