summaryrefslogtreecommitdiff
path: root/plugin.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2020-06-29 09:29:06 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2020-06-29 09:29:06 +0200
commit5193fd9d9945437fbc7663f1585ae5d96d2ba103 (patch)
treea8a634140a849b64e21675bb726bf01609fa38cd /plugin.c
parenta526eee1651ca643a3f3c88a0c852a43261a7ebb (diff)
downloadvdr-5193fd9d9945437fbc7663f1585ae5d96d2ba103.tar.gz
vdr-5193fd9d9945437fbc7663f1585ae5d96d2ba103.tar.bz2
Improved deleting plugins in case the plugin uses its own memory management
Diffstat (limited to 'plugin.c')
-rw-r--r--plugin.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/plugin.c b/plugin.c
index 223d709d..0e0f2d13 100644
--- a/plugin.c
+++ b/plugin.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: plugin.c 4.1 2015/04/18 14:51:20 kls Exp $
+ * $Id: plugin.c 4.2 2020/06/29 09:29:06 kls Exp $
*/
#include "plugin.h"
@@ -182,11 +182,15 @@ cDll::cDll(const char *FileName, const char *Args)
args = Args ? strdup(Args) : NULL;
handle = NULL;
plugin = NULL;
+ destroy = NULL;
}
cDll::~cDll()
{
- delete plugin;
+ if (destroy)
+ destroy(plugin);
+ else
+ delete plugin; // silently fall back for plugins compiled with VDR version <= 2.4.3
if (handle)
dlclose(handle);
free(args);
@@ -223,10 +227,11 @@ bool cDll::Load(bool Log)
handle = dlopen(fileName, RTLD_NOW);
const char *error = dlerror();
if (!error) {
- void *(*creator)(void);
- creator = (void *(*)(void))dlsym(handle, "VDRPluginCreator");
+ typedef cPlugin *create_t(void);
+ create_t *create = (create_t *)dlsym(handle, "VDRPluginCreator");
if (!(error = dlerror()))
- plugin = (cPlugin *)creator();
+ plugin = create();
+ destroy = (destroy_t *)dlsym(handle, "VDRPluginDestroyer");
}
if (!error) {
if (plugin && args) {