aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/modules/system/plugin.cpp35
-rw-r--r--src/modules/system/plugin.h2
2 files changed, 36 insertions, 1 deletions
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();