From 8b8a091fa4bdb74e78676410e6809b1d525056c7 Mon Sep 17 00:00:00 2001 From: Alexey Yakovenko Date: Sun, 6 Sep 2009 14:54:53 +0200 Subject: added mutex locking for plugin events --- plugins.c | 23 ++++++++++++++++++----- plugins.h | 10 +++++----- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/plugins.c b/plugins.c index 4062553f..b64e5fef 100644 --- a/plugins.c +++ b/plugins.c @@ -40,8 +40,10 @@ #include "conf.h" #include "junklib.h" +static uintptr_t mutex; + // deadbeef api -DB_functions_t deadbeef_api = { +static DB_functions_t deadbeef_api = { // FIXME: set to 1.0 after api freeze .vmajor = 0, .vminor = 0, @@ -148,28 +150,35 @@ plugin_t *plugins; void plug_ev_subscribe (DB_plugin_t *plugin, int ev, DB_callback_t callback, uintptr_t data) { assert (ev < DB_EV_MAX && ev >= 0); - for (int i = 0; i < MAX_HANDLERS; i++) { + int i; + mutex_lock (mutex); + for (i = 0; i < MAX_HANDLERS; i++) { if (!handlers[ev][i].plugin) { handlers[ev][i].plugin = plugin; handlers[ev][i].callback = callback; handlers[ev][i].data = data; - return; + break; } } - fprintf (stderr, "failed to subscribe plugin %s to event %d (too many event handlers)\n", plugin->name, ev); + mutex_unlock (mutex); + if (i == MAX_HANDLERS) { + fprintf (stderr, "failed to subscribe plugin %s to event %d (too many event handlers)\n", plugin->name, ev); + } } void plug_ev_unsubscribe (DB_plugin_t *plugin, int ev, DB_callback_t callback, uintptr_t data) { assert (ev < DB_EV_MAX && ev >= 0); + mutex_lock (mutex); for (int i = 0; i < MAX_HANDLERS; i++) { if (handlers[ev][i].plugin == plugin) { handlers[ev][i].plugin = NULL; handlers[ev][i].callback = NULL; handlers[ev][i].data = 0; - return; + break; } } + mutex_unlock (mutex); } void @@ -228,6 +237,7 @@ plug_quit (void) { /////// non-api functions (plugin support) void plug_trigger_event (int ev) { + mutex_lock (mutex); DB_event_t *event; switch (ev) { case DB_EV_SONGSTARTED: @@ -249,6 +259,7 @@ plug_trigger_event (int ev) { } } free (event); + mutex_unlock (mutex); } int @@ -273,6 +284,7 @@ plug_init_plugin (DB_plugin_t* (*loadfunc)(DB_functions_t *), void *handle) { void plug_load_all (void) { + mutex = mutex_create (); char dirname[1024]; snprintf (dirname, 1024, "%s/lib/deadbeef", PREFIX); struct dirent **namelist = NULL; @@ -388,6 +400,7 @@ plug_unload_all (void) { } plugins = next; } + mutex_free (mutex); } struct DB_decoder_s ** diff --git a/plugins.h b/plugins.h index e7325ada..ca0c5668 100644 --- a/plugins.h +++ b/plugins.h @@ -21,19 +21,19 @@ #include "deadbeef.h" void -plug_ev_subscribe (DB_plugin_t *plugin, int ev, DB_callback_t callback, uintptr_t data); +plug_load_all (void); void -plug_ev_unsubscribe (DB_plugin_t *plugin, int ev, DB_callback_t callback, uintptr_t data); +plug_unload_all (void); void -plug_trigger_event (int ev); +plug_ev_subscribe (DB_plugin_t *plugin, int ev, DB_callback_t callback, uintptr_t data); void -plug_load_all (void); +plug_ev_unsubscribe (DB_plugin_t *plugin, int ev, DB_callback_t callback, uintptr_t data); void -plug_unload_all (void); +plug_trigger_event (int ev); void plug_md5 (uint8_t sig[16], const char *in, int len); -- cgit v1.2.3