Hi Marcel, Modified patch attached. On Tue, Apr 21, 2009 at 4:11 PM, Marcel Holtmann <marcel@xxxxxxxxxxxx> wrote: > Hi Alok, > >> >> modified patch attached. >> > >> > please to the line-break with BLUETOOTH_PLUGIN_DEFINE a little bit more >> > like what ConnMan does so it looks nicer. >> > >> Infact i copied the syntax for BLUETOOTH_PLUGIN_DEFINE from the one in >> connman. :D > > I meant the calls inside the plugins and not the definition itself. > > Regards > > Marcel > > >
From a8c47dd5df16a0aa1eb76edea3254a5711c83327 Mon Sep 17 00:00:00 2001 From: Alok Barsode <alok.barsode@xxxxxxxxxx> Date: Tue, 21 Apr 2009 16:33:36 +0530 Subject: [PATCH] Add priority field to plugin descriptor definition and load plugins in priority order. --- audio/main.c | 3 ++- input/main.c | 3 ++- network/main.c | 3 ++- plugins/echo.c | 3 ++- plugins/hal.c | 3 ++- plugins/netlink.c | 3 ++- plugins/service.c | 3 ++- plugins/storage.c | 3 ++- serial/main.c | 3 ++- src/plugin.c | 29 ++++++++++++++++++++++------- src/plugin.h | 8 ++++++-- 11 files changed, 46 insertions(+), 18 deletions(-) diff --git a/audio/main.c b/audio/main.c index 565c83b..761392a 100644 --- a/audio/main.c +++ b/audio/main.c @@ -176,4 +176,5 @@ static void audio_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("audio", VERSION, audio_init, audio_exit) +BLUETOOTH_PLUGIN_DEFINE("audio", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, audio_init, audio_exit) diff --git a/input/main.c b/input/main.c index 010b731..2834201 100644 --- a/input/main.c +++ b/input/main.c @@ -82,4 +82,5 @@ static void input_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("input", VERSION, input_init, input_exit) +BLUETOOTH_PLUGIN_DEFINE("input", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, input_init, input_exit) diff --git a/network/main.c b/network/main.c index 5f96d4b..7e45eba 100644 --- a/network/main.c +++ b/network/main.c @@ -55,4 +55,5 @@ static void network_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("network", VERSION, network_init, network_exit) +BLUETOOTH_PLUGIN_DEFINE("network", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, network_init, network_exit) diff --git a/plugins/echo.c b/plugins/echo.c index 832bf8b..4443ff1 100644 --- a/plugins/echo.c +++ b/plugins/echo.c @@ -163,4 +163,5 @@ static void echo_exit(void) btd_unregister_adapter_driver(&echo_server); } -BLUETOOTH_PLUGIN_DEFINE("echo", VERSION, echo_init, echo_exit) +BLUETOOTH_PLUGIN_DEFINE("echo", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, echo_init, echo_exit) diff --git a/plugins/hal.c b/plugins/hal.c index 219b46e..683777c 100644 --- a/plugins/hal.c +++ b/plugins/hal.c @@ -158,4 +158,5 @@ static void hal_exit(void) btd_unregister_adapter_driver(&hal_driver); } -BLUETOOTH_PLUGIN_DEFINE("hal", VERSION, hal_init, hal_exit) +BLUETOOTH_PLUGIN_DEFINE("hal", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, hal_init, hal_exit) diff --git a/plugins/netlink.c b/plugins/netlink.c index f777cf9..d1e91b2 100644 --- a/plugins/netlink.c +++ b/plugins/netlink.c @@ -123,4 +123,5 @@ static void netlink_exit(void) nl_handle_destroy(handle); } -BLUETOOTH_PLUGIN_DEFINE("netlink", VERSION, netlink_init, netlink_exit) +BLUETOOTH_PLUGIN_DEFINE("netlink", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, netlink_init, netlink_exit) diff --git a/plugins/service.c b/plugins/service.c index b28c9c1..d81abe8 100644 --- a/plugins/service.c +++ b/plugins/service.c @@ -859,4 +859,5 @@ static void service_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("service", VERSION, service_init, service_exit) +BLUETOOTH_PLUGIN_DEFINE("service", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, service_init, service_exit) diff --git a/plugins/storage.c b/plugins/storage.c index c4dbe16..0abc616 100644 --- a/plugins/storage.c +++ b/plugins/storage.c @@ -39,4 +39,5 @@ static void storage_exit(void) { } -BLUETOOTH_PLUGIN_DEFINE("storage", VERSION, storage_init, storage_exit) +BLUETOOTH_PLUGIN_DEFINE("storage", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, storage_init, storage_exit) diff --git a/serial/main.c b/serial/main.c index 5db389c..3949271 100644 --- a/serial/main.c +++ b/serial/main.c @@ -55,4 +55,5 @@ static void serial_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("serial", VERSION, serial_init, serial_exit) +BLUETOOTH_PLUGIN_DEFINE("serial", VERSION, + BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, serial_init, serial_exit) diff --git a/src/plugin.c b/src/plugin.c index 051c33c..a17a7ea 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -43,9 +43,18 @@ static GSList *plugins = NULL; struct bluetooth_plugin { void *handle; + gboolean active; struct bluetooth_plugin_desc *desc; }; +static gint compare_priority(gconstpointer a, gconstpointer b) +{ + const struct bluetooth_plugin *plugin1 = a; + const struct bluetooth_plugin *plugin2 = b; + + return plugin2->desc->priority - plugin1->desc->priority; +} + static gboolean add_plugin(void *handle, struct bluetooth_plugin_desc *desc) { struct bluetooth_plugin *plugin; @@ -63,14 +72,10 @@ static gboolean add_plugin(void *handle, struct bluetooth_plugin_desc *desc) return FALSE; plugin->handle = handle; + plugin->active = FALSE; plugin->desc = desc; - if (desc->init() < 0) { - g_free(plugin); - return FALSE; - } - - plugins = g_slist_append(plugins, plugin); + plugins = g_slist_insert_sorted(plugins, plugin, compare_priority); return TRUE; } @@ -98,6 +103,7 @@ static gboolean is_disabled(const char *name, char **list) gboolean plugin_init(GKeyFile *config) { + GSList *list; GDir *dir; const gchar *file; gchar **disabled; @@ -171,6 +177,15 @@ gboolean plugin_init(GKeyFile *config) g_strfreev(disabled); + for (list = plugins; list; list = list->next) { + struct bluetooth_plugin *plugin = list->data; + + if (plugin->desc->init() < 0) + continue; + + plugin->active = TRUE; + } + return TRUE; } @@ -183,7 +198,7 @@ void plugin_cleanup(void) for (list = plugins; list; list = list->next) { struct bluetooth_plugin *plugin = list->data; - if (plugin->desc->exit) + if (plugin->active == TRUE && plugin->desc->exit) plugin->desc->exit(); dlclose(plugin->handle); diff --git a/src/plugin.h b/src/plugin.h index 62d5f75..dc37224 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -20,17 +20,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ +#define BLUETOOTH_PLUGIN_PRIORITY_LOW -100 +#define BLUETOOTH_PLUGIN_PRIORITY_DEFAULT 0 +#define BLUETOOTH_PLUGIN_PRIORITY_HIGH 100 struct bluetooth_plugin_desc { const char *name; const char *version; + int priority; int (*init) (void); void (*exit) (void); }; -#define BLUETOOTH_PLUGIN_DEFINE(name,version,init,exit) \ +#define BLUETOOTH_PLUGIN_DEFINE(name, version, priority, init, exit) \ extern struct bluetooth_plugin_desc bluetooth_plugin_desc \ __attribute__ ((visibility("default"))); \ struct bluetooth_plugin_desc bluetooth_plugin_desc = { \ - name, version, init, exit \ + name, version, priority, init, exit \ }; -- 1.5.6.3