diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2020-06-29 09:29:06 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2020-06-29 09:29:06 +0200 |
commit | 5193fd9d9945437fbc7663f1585ae5d96d2ba103 (patch) | |
tree | a8a634140a849b64e21675bb726bf01609fa38cd /plugin.c | |
parent | a526eee1651ca643a3f3c88a0c852a43261a7ebb (diff) | |
download | vdr-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.c | 15 |
1 files changed, 10 insertions, 5 deletions
@@ -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) { |