From adf2d3863b679fbf5f7b579ceacddb752c4a9103 Mon Sep 17 00:00:00 2001 From: TheXception Date: Mon, 23 Apr 2007 09:39:23 +0000 Subject: added _free function again due problems while freeing memory git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@529 17fca916-40b9-46aa-a4ea-0a15b648b75c --- src/modules/system/plugin.cpp | 35 ++++++++++++++++++++++++++++++++++- src/modules/system/plugin.h | 2 ++ 2 files changed, 36 insertions(+), 1 deletion(-) (limited to 'src/modules/system') diff --git a/src/modules/system/plugin.cpp b/src/modules/system/plugin.cpp index ba18ade47..9d91c12b4 100644 --- a/src/modules/system/plugin.cpp +++ b/src/modules/system/plugin.cpp @@ -47,6 +47,16 @@ @body: TODO [b]Exported functions by dll[/b][br] + [br]_free function (needed)[br] + [example] + int _free(void * p)[br] + {[br] + // Always free the memory here![br] + free(p);[br] + return 0;[br] + }[br] + [/example] + [br]_load function (optional)[br] [example] int _load()[br] @@ -105,6 +115,20 @@ KviPlugin* KviPlugin::load(const QString& szFileName) return pPlugin; } +bool KviPlugin::pfree(char * pBuffer) +{ + plugin_free function_free; + + function_free = (plugin_free)kvi_library_symbol(m_Plugin,"_free"); + if (function_free) + { + //TODO: THREAD + if(pBuffer) function_free(pBuffer); + return true; + } + return false; +} + bool KviPlugin::unload(bool forced) { plugin_unload function_unload; @@ -264,7 +288,16 @@ bool KviPluginManager::pluginCall(KviKvsModuleFunctionCall *c) //Clean up if(pArgvBuffer) free(pArgvBuffer); if(ppArgv) free(ppArgv); - if(returnBuffer) free(returnBuffer); + if(returnBuffer) + { + if (!plugin->pfree(returnBuffer)) + { + c->warning(__tr2qs("The plugin has no function to free memory. Can result in Memory Leaks!")); + } + } + + + return true; } diff --git a/src/modules/system/plugin.h b/src/modules/system/plugin.h index 43c513fe3..cd6002e5c 100644 --- a/src/modules/system/plugin.h +++ b/src/modules/system/plugin.h @@ -32,6 +32,7 @@ typedef int (*plugin_function)(int argc, char* argv[], char ** buffer); typedef int (*plugin_unload)(); typedef int (*plugin_load)(); +typedef int (*plugin_free)(char * pBuffer); class KviPlugin { @@ -47,6 +48,7 @@ private: QString m_szName; public: static KviPlugin* load(const QString& szFileName); + bool pfree(char * pBuffer); bool unload(bool forced); int call(const QString& szFunctionName, int argc, char * argv[], char ** pBuffer); QString name(); -- cgit v1.3.1-10-gc9f91