db/DatabasePlugin: pass EventThread's EventLoop to create()

Allows database plugins to use the EventThread, e.g. for CURL
integration.
This commit is contained in:
Max Kellermann 2017-08-24 19:49:54 +02:00
parent 7e76656a18
commit 28a2d41b85
11 changed files with 29 additions and 13 deletions

View File

@ -193,7 +193,9 @@ static bool
glue_db_init_and_load(void) glue_db_init_and_load(void)
{ {
instance->database = instance->database =
CreateConfiguredDatabase(instance->event_loop, *instance); CreateConfiguredDatabase(instance->event_loop,
instance->io_thread.GetEventLoop(),
*instance);
if (instance->database == nullptr) if (instance->database == nullptr)
return true; return true;

View File

@ -28,7 +28,7 @@
#include "util/RuntimeError.hxx" #include "util/RuntimeError.hxx"
Database * Database *
CreateConfiguredDatabase(EventLoop &main_event_loop, CreateConfiguredDatabase(EventLoop &main_event_loop, EventLoop &io_event_loop,
DatabaseListener &listener) DatabaseListener &listener)
{ {
const auto *param = config_get_block(ConfigBlockOption::DATABASE); const auto *param = config_get_block(ConfigBlockOption::DATABASE);
@ -39,12 +39,12 @@ CreateConfiguredDatabase(EventLoop &main_event_loop,
param->line, path->line); param->line, path->line);
if (param != nullptr) if (param != nullptr)
return DatabaseGlobalInit(main_event_loop, return DatabaseGlobalInit(main_event_loop, io_event_loop,
listener, *param); listener, *param);
else if (path != nullptr) { else if (path != nullptr) {
ConfigBlock block(path->line); ConfigBlock block(path->line);
block.AddBlockParam("path", path->value.c_str(), path->line); block.AddBlockParam("path", path->value.c_str(), path->line);
return DatabaseGlobalInit(main_event_loop, return DatabaseGlobalInit(main_event_loop, io_event_loop,
listener, block); listener, block);
} else { } else {
/* if there is no override, use the cache directory */ /* if there is no override, use the cache directory */
@ -61,7 +61,7 @@ CreateConfiguredDatabase(EventLoop &main_event_loop,
ConfigBlock block; ConfigBlock block;
block.AddBlockParam("path", db_file_utf8.c_str(), -1); block.AddBlockParam("path", db_file_utf8.c_str(), -1);
return DatabaseGlobalInit(main_event_loop, return DatabaseGlobalInit(main_event_loop, io_event_loop,
listener, block); listener, block);
} }
} }

View File

@ -34,7 +34,7 @@ class Database;
* Throws #std::runtime_error on error. * Throws #std::runtime_error on error.
*/ */
Database * Database *
CreateConfiguredDatabase(EventLoop &main_event_loop, CreateConfiguredDatabase(EventLoop &main_event_loop, EventLoop &io_event_loop,
DatabaseListener &listener); DatabaseListener &listener);
#endif #endif

View File

@ -27,6 +27,7 @@
Database * Database *
DatabaseGlobalInit(EventLoop &main_event_loop, DatabaseGlobalInit(EventLoop &main_event_loop,
EventLoop &io_event_loop,
DatabaseListener &listener, DatabaseListener &listener,
const ConfigBlock &block) const ConfigBlock &block)
{ {
@ -39,7 +40,8 @@ DatabaseGlobalInit(EventLoop &main_event_loop,
plugin_name); plugin_name);
try { try {
return plugin->create(main_event_loop, listener, block); return plugin->create(main_event_loop, io_event_loop,
listener, block);
} catch (...) { } catch (...) {
std::throw_with_nested(FormatRuntimeError("Failed to initialize database plugin '%s'", std::throw_with_nested(FormatRuntimeError("Failed to initialize database plugin '%s'",
plugin_name)); plugin_name));

View File

@ -36,6 +36,7 @@ class Database;
*/ */
Database * Database *
DatabaseGlobalInit(EventLoop &main_event_loop, DatabaseGlobalInit(EventLoop &main_event_loop,
EventLoop &io_event_loop,
DatabaseListener &listener, DatabaseListener &listener,
const ConfigBlock &block); const ConfigBlock &block);

View File

@ -49,8 +49,11 @@ struct DatabasePlugin {
* *
* @param main_event_loop the #EventLoop running in the same * @param main_event_loop the #EventLoop running in the same
* thread which invokes #Database methods * thread which invokes #Database methods
* @param io_event_loop the #EventLoop running on the
* #EventThread, i.e. the one used for background I/O
*/ */
Database *(*create)(EventLoop &main_event_loop, Database *(*create)(EventLoop &main_event_loop,
EventLoop &io_event_loop,
DatabaseListener &listener, DatabaseListener &listener,
const ConfigBlock &block); const ConfigBlock &block);

View File

@ -107,7 +107,9 @@ public:
ProxyDatabase(EventLoop &_loop, DatabaseListener &_listener, ProxyDatabase(EventLoop &_loop, DatabaseListener &_listener,
const ConfigBlock &block); const ConfigBlock &block);
static Database *Create(EventLoop &loop, DatabaseListener &listener, static Database *Create(EventLoop &main_event_loop,
EventLoop &io_event_loop,
DatabaseListener &listener,
const ConfigBlock &block); const ConfigBlock &block);
void Open() override; void Open() override;
@ -345,7 +347,8 @@ ProxyDatabase::ProxyDatabase(EventLoop &_loop, DatabaseListener &_listener,
} }
Database * Database *
ProxyDatabase::Create(EventLoop &loop, DatabaseListener &listener, ProxyDatabase::Create(EventLoop &loop, EventLoop &,
DatabaseListener &listener,
const ConfigBlock &block) const ConfigBlock &block)
{ {
return new ProxyDatabase(loop, listener, block); return new ProxyDatabase(loop, listener, block);

View File

@ -83,7 +83,7 @@ inline SimpleDatabase::SimpleDatabase(AllocatedPath &&_path,
} }
Database * Database *
SimpleDatabase::Create(gcc_unused EventLoop &loop, SimpleDatabase::Create(EventLoop &, EventLoop &,
gcc_unused DatabaseListener &listener, gcc_unused DatabaseListener &listener,
const ConfigBlock &block) const ConfigBlock &block)
{ {

View File

@ -72,7 +72,9 @@ class SimpleDatabase : public Database {
SimpleDatabase(AllocatedPath &&_path, bool _compress); SimpleDatabase(AllocatedPath &&_path, bool _compress);
public: public:
static Database *Create(EventLoop &loop, DatabaseListener &listener, static Database *Create(EventLoop &main_event_loop,
EventLoop &io_event_loop,
DatabaseListener &listener,
const ConfigBlock &block); const ConfigBlock &block);
gcc_pure gcc_pure

View File

@ -75,7 +75,9 @@ class UpnpDatabase : public Database {
public: public:
UpnpDatabase():Database(upnp_db_plugin) {} UpnpDatabase():Database(upnp_db_plugin) {}
static Database *Create(EventLoop &loop, DatabaseListener &listener, static Database *Create(EventLoop &main_event_loop,
EventLoop &io_event_loop,
DatabaseListener &listener,
const ConfigBlock &block); const ConfigBlock &block);
void Open() override; void Open() override;
@ -138,7 +140,7 @@ private:
}; };
Database * Database *
UpnpDatabase::Create(gcc_unused EventLoop &loop, UpnpDatabase::Create(EventLoop &, EventLoop &,
gcc_unused DatabaseListener &listener, gcc_unused DatabaseListener &listener,
const ConfigBlock &) const ConfigBlock &)
{ {

View File

@ -138,6 +138,7 @@ try {
block.AddBlockParam("path", path->value.c_str(), path->line); block.AddBlockParam("path", path->value.c_str(), path->line);
Database *db = plugin->create(init.GetEventLoop(), Database *db = plugin->create(init.GetEventLoop(),
init.GetEventLoop(),
database_listener, block); database_listener, block);
AtScopeExit(db) { delete db; }; AtScopeExit(db) { delete db; };