assert(plugin);
void *library = plugin->library;
delete plugin;
- if (!disable_dlclose) {
+ if (library && !disable_dlclose) {
dlclose(library);
}
}
std::map<std::string,ErasureCodePlugin*>::iterator plugin = plugins.find(name);
void *library = plugin->second->library;
delete plugin->second;
- dlclose(library);
+ if (library) {
+ dlclose(library);
+ }
plugins.erase(plugin);
return 0;
}
return 0;
}
+static std::map<std::string, std::function<ErasureCodePlugin*()>>&
+builtin_plugins()
+{
+ static std::map<std::string, std::function<ErasureCodePlugin*()>> reg;
+ return reg;
+}
+
+int ErasureCodePluginRegistry::register_builtin(
+ const std::string &name,
+ std::function<ErasureCodePlugin*()> create)
+{
+ builtin_plugins()[name] = std::move(create);
+ return 0;
+}
+
int ErasureCodePluginRegistry::factory(const std::string &plugin_name,
const std::string &directory,
ErasureCodeProfile &profile,
ostream *ss)
{
ceph_assert(ceph_mutex_is_locked(lock));
+
+ if (auto it = builtin_plugins().find(plugin_name);
+ it != builtin_plugins().end()) {
+ int r = add(plugin_name, it->second());
+ if (r == 0) {
+ *plugin = get(plugin_name);
+ }
+ return r;
+ }
+
std::string fname = directory + "/" PLUGIN_PREFIX
+ plugin_name + PLUGIN_SUFFIX;
void *library = dlopen(fname.c_str(), RTLD_NOW);
#ifndef CEPH_ERASURE_CODE_PLUGIN_H
#define CEPH_ERASURE_CODE_PLUGIN_H
+#include <functional>
+
#include "common/ceph_mutex.h"
#include "ErasureCodeInterface.h"
int remove(const std::string &name);
ErasureCodePlugin *get(const std::string &name);
+ static int register_builtin(
+ const std::string &name,
+ std::function<ErasureCodePlugin*()> create);
+
int load(const std::string &plugin_name,
const std::string &directory,
ErasureCodePlugin **plugin,