Hi Marcel, Adding priority field for plugins. Let me know if anything needs modifications. Cheers, Alok.
From de02d49db85b7cab49fb920d21da3c1109250510 Mon Sep 17 00:00:00 2001 From: Alok Barsode <alok.barsode@xxxxxxxxxx> Date: Mon, 20 Apr 2009 20:40:10 +0530 Subject: [PATCH] Add priority field to plugin descriptor definition and load plugins in priority order. --- audio/main.c | 2 +- input/main.c | 2 +- network/main.c | 2 +- plugins/echo.c | 2 +- plugins/hal.c | 2 +- plugins/netlink.c | 2 +- plugins/service.c | 2 +- plugins/storage.c | 2 +- serial/main.c | 2 +- src/plugin.c | 29 ++++++++++++++++++++++------- src/plugin.h | 8 ++++++-- 11 files changed, 37 insertions(+), 18 deletions(-) diff --git a/audio/main.c b/audio/main.c index 565c83b..c481b69 100644 --- a/audio/main.c +++ b/audio/main.c @@ -176,4 +176,4 @@ static void audio_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("audio", VERSION, audio_init, audio_exit) +BLUETOOTH_PLUGIN_DEFINE("audio", VERSION, PLUGIN_PRIORITY_DEFAULT, audio_init, audio_exit) diff --git a/input/main.c b/input/main.c index 010b731..51ded43 100644 --- a/input/main.c +++ b/input/main.c @@ -82,4 +82,4 @@ static void input_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("input", VERSION, input_init, input_exit) +BLUETOOTH_PLUGIN_DEFINE("input", VERSION, PLUGIN_PRIORITY_DEFAULT, input_init, input_exit) diff --git a/network/main.c b/network/main.c index 5f96d4b..5074f4e 100644 --- a/network/main.c +++ b/network/main.c @@ -55,4 +55,4 @@ static void network_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("network", VERSION, network_init, network_exit) +BLUETOOTH_PLUGIN_DEFINE("network", VERSION, PLUGIN_PRIORITY_DEFAULT, network_init, network_exit) diff --git a/plugins/echo.c b/plugins/echo.c index 832bf8b..6f918e8 100644 --- a/plugins/echo.c +++ b/plugins/echo.c @@ -163,4 +163,4 @@ 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, PLUGIN_PRIORITY_DEFAULT, echo_init, echo_exit) diff --git a/plugins/hal.c b/plugins/hal.c index 219b46e..f2d3083 100644 --- a/plugins/hal.c +++ b/plugins/hal.c @@ -158,4 +158,4 @@ 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, PLUGIN_PRIORITY_DEFAULT, hal_init, hal_exit) diff --git a/plugins/netlink.c b/plugins/netlink.c index f777cf9..c50dd77 100644 --- a/plugins/netlink.c +++ b/plugins/netlink.c @@ -123,4 +123,4 @@ static void netlink_exit(void) nl_handle_destroy(handle); } -BLUETOOTH_PLUGIN_DEFINE("netlink", VERSION, netlink_init, netlink_exit) +BLUETOOTH_PLUGIN_DEFINE("netlink", VERSION, PLUGIN_PRIORITY_DEFAULT, netlink_init, netlink_exit) diff --git a/plugins/service.c b/plugins/service.c index b28c9c1..5bca625 100644 --- a/plugins/service.c +++ b/plugins/service.c @@ -859,4 +859,4 @@ static void service_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("service", VERSION, service_init, service_exit) +BLUETOOTH_PLUGIN_DEFINE("service", VERSION, PLUGIN_PRIORITY_DEFAULT, service_init, service_exit) diff --git a/plugins/storage.c b/plugins/storage.c index c4dbe16..3e79b8a 100644 --- a/plugins/storage.c +++ b/plugins/storage.c @@ -39,4 +39,4 @@ static void storage_exit(void) { } -BLUETOOTH_PLUGIN_DEFINE("storage", VERSION, storage_init, storage_exit) +BLUETOOTH_PLUGIN_DEFINE("storage", VERSION, PLUGIN_PRIORITY_DEFAULT, storage_init, storage_exit) diff --git a/serial/main.c b/serial/main.c index 5db389c..509cc38 100644 --- a/serial/main.c +++ b/serial/main.c @@ -55,4 +55,4 @@ static void serial_exit(void) dbus_connection_unref(connection); } -BLUETOOTH_PLUGIN_DEFINE("serial", VERSION, serial_init, serial_exit) +BLUETOOTH_PLUGIN_DEFINE("serial", VERSION, 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..2cd50f7 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 PLUGIN_PRIORITY_LOW -100 +#define PLUGIN_PRIORITY_DEFAULT 0 +#define 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