summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-02-21 21:45:12 +0100
committerGravatar waker <wakeroid@gmail.com>2011-02-21 21:45:12 +0100
commit10dbebc87c1292877d00eaef8a5ddcc51aac8ff1 (patch)
tree0fc57d9fb67922e6365ec1ea231084f5f006186e
parentb87dcbaadf6064d66c7c34f8c1c9a0c1e9bf5622 (diff)
added new plugin.connect method to base plugin interface, which does the opposite of connect
-rw-r--r--deadbeef.h4
-rw-r--r--main.c1
-rw-r--r--plugins.c19
-rw-r--r--plugins.h5
4 files changed, 28 insertions, 1 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 49a37931..d10f967d 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -626,6 +626,10 @@ typedef struct DB_plugin_s {
// it is called after all plugin's start method was executed
// can be NULL
int (*connect) (void);
+
+ // opposite of connect, will be called before stop, while all plugins are still
+ // in "started" state
+ int (*disconnect) (void);
// exec_cmdline may be called at any moment when user sends commandline to player
// can be NULL if plugin doesn't support commandline processing
diff --git a/main.c b/main.c
index 0014916b..7598160f 100644
--- a/main.c
+++ b/main.c
@@ -834,6 +834,7 @@ main (int argc, char *argv[]) {
// plugins might still hood references to playitems,
// and query configuration in background
// so unload everything 1st before final cleanup
+ plug_disconnect_all ();
plug_unload_all ();
// at this point we can simply do exit(0), but let's clean up for debugging
diff --git a/plugins.c b/plugins.c
index adc1ded2..bb12d3dc 100644
--- a/plugins.c
+++ b/plugins.c
@@ -887,6 +887,9 @@ plug_connect_all (void) {
if (plug->plugin->connect () < 0) {
fprintf (stderr, "plugin %s failed to connect to dependencies, deactivated.\n", plug->plugin->name);
+ if (plug->plugin->disconnect) {
+ plug->plugin->disconnect ();
+ }
if (plug->plugin->stop) {
plug->plugin->stop ();
}
@@ -914,6 +917,22 @@ plug_connect_all (void) {
}
void
+plug_disconnect_all (void) {
+ trace ("plug_disconnect_all\n");
+ plugin_t *plug;
+ plugin_t *prev = NULL;
+ for (plug = plugins; plug;) {
+ if (plug->plugin->disconnect) {
+ if (plug->plugin->disconnect () < 0) {
+ trace ("plugin %s failed to disconnect\n", plug->plugin->name);
+ }
+ }
+ prev = plug;
+ plug = plug->next;
+ }
+}
+
+void
plug_unload_all (void) {
trace ("plug_unload_all\n");
plugin_t *p;
diff --git a/plugins.h b/plugins.h
index a1fe338c..a7006397 100644
--- a/plugins.h
+++ b/plugins.h
@@ -28,10 +28,13 @@ int
plug_load_all (void);
void
+plug_unload_all (void);
+
+void
plug_connect_all (void);
void
-plug_unload_all (void);
+plug_disconnect_all (void);
void
plug_cleanup (void);