summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/MirLua/src/m_core.cpp103
-rw-r--r--plugins/MirLua/src/mlua.cpp9
-rw-r--r--plugins/MirLua/src/mlua.h3
-rw-r--r--plugins/MirLua/src/mlua_console.cpp2
-rw-r--r--plugins/MirLua/src/version.h2
5 files changed, 111 insertions, 8 deletions
diff --git a/plugins/MirLua/src/m_core.cpp b/plugins/MirLua/src/m_core.cpp
index ed30486aad..90dffe5f7c 100644
--- a/plugins/MirLua/src/m_core.cpp
+++ b/plugins/MirLua/src/m_core.cpp
@@ -1,5 +1,69 @@
#include "stdafx.h"
+static LIST<void> Hooks(1, PtrKeySortT);
+static LIST<void> Events(1, PtrKeySortT);
+static LIST<void> Services(1, PtrKeySortT);
+
+struct HandleRefParam
+{
+ HANDLE h;
+ int ref;
+ lua_State *L;
+ HandleRefParam(HANDLE h) : L(NULL), h(h), ref(0) { }
+ HandleRefParam(lua_State *L, HANDLE h, int ref = 0) : L(L), h(h), ref(ref) { }
+};
+static LIST<void> HookRefs(1, HandleKeySortT);
+static LIST<void> ServiceRefs(1, HandleKeySortT);
+
+void CMLua::KillModuleEventHooks()
+{
+ while (Hooks.getCount())
+ {
+ HANDLE hHook = Hooks[0];
+ Hooks.remove(0);
+ UnhookEvent(hHook);
+ }
+
+ while (Events.getCount())
+ {
+ HANDLE hEvent = Events[0];
+ Events.remove(hEvent);
+ DestroyHookableEvent(hEvent);
+ }
+
+ while (HookRefs.getCount())
+ {
+ HandleRefParam *param = (HandleRefParam*)HookRefs[0];
+ if (param != NULL)
+ {
+ luaL_unref(param->L, LUA_REGISTRYINDEX, param->ref);
+ HookRefs.remove(0);
+ delete param;
+ }
+ }
+}
+
+void CMLua::KillModuleServices()
+{
+ while (Services.getCount())
+ {
+ HANDLE hService = Services[0];
+ Services.remove(0);
+ DestroyServiceFunction(hService);
+ }
+
+ while (ServiceRefs.getCount())
+ {
+ HandleRefParam *param = (HandleRefParam*)ServiceRefs[0];
+ if (param != NULL)
+ {
+ luaL_unref(param->L, LUA_REGISTRYINDEX, param->ref);
+ ServiceRefs.remove(0);
+ delete param;
+ }
+ }
+}
+
static int lua_CreateHookableEvent(lua_State *L)
{
const char *name = luaL_checkstring(L, 1);
@@ -7,6 +71,8 @@ static int lua_CreateHookableEvent(lua_State *L)
HANDLE res = ::CreateHookableEvent(name);
lua_pushlightuserdata(L, res);
+ Events.insert(res);
+
return 1;
}
@@ -14,6 +80,8 @@ static int lua_DestroyHookableEvent(lua_State *L)
{
HANDLE hEvent = (HANDLE)lua_touserdata(L, 1);
+ Events.remove(hEvent);
+
int res = ::DestroyHookableEvent(hEvent);
lua_pushinteger(L, res);
@@ -48,6 +116,9 @@ static int lua_HookEvent(lua_State *L)
HANDLE res = ::HookEventObjParam(name, CMLua::HookEventObjParam, L, ref);
lua_pushlightuserdata(L, res);
+ Hooks.insert(res);
+ HookRefs.insert(new HandleRefParam(L, res, ref));
+
return 1;
}
@@ -55,6 +126,16 @@ static int lua_UnhookEvent(lua_State *L)
{
HANDLE hEvent = (HANDLE)lua_touserdata(L, 1);
+ Hooks.remove(hEvent);
+
+ HandleRefParam *param = (HandleRefParam*)HookRefs.find(hEvent);
+ if (param != NULL)
+ {
+ luaL_unref(param->L, LUA_REGISTRYINDEX, param->ref);
+ HookRefs.remove(param);
+ delete param;
+ }
+
int res = ::UnhookEvent(hEvent);
lua_pushinteger(L, res);
@@ -75,6 +156,9 @@ static int lua_OnModulesLoaded(lua_State *L)
HANDLE res = ::HookEventObjParam(ME_SYSTEM_MODULESLOADED, CMLua::HookEventObjParam, L, ref);
lua_pushlightuserdata(L, res);
+ Hooks.insert(res);
+ HookRefs.insert(new HandleRefParam(L, res, ref));
+
return 1;
}
@@ -92,6 +176,9 @@ static int lua_OnPreShutdown(lua_State *L)
HANDLE res = ::HookEventObjParam(ME_SYSTEM_PRESHUTDOWN, CMLua::HookEventObjParam, L, ref);
lua_pushlightuserdata(L, res);
+ Hooks.insert(res);
+ HookRefs.insert(new HandleRefParam(L, res, ref));
+
return 1;
}
@@ -108,8 +195,7 @@ static INT_PTR ServiceFunctionObjParam(void *obj, WPARAM wParam, LPARAM lParam,
printf("%s\n", lua_tostring(L, -1));
INT_PTR res = (INT_PTR)lua_tointeger(L, 1);
-
- //luaL_unref(L, LUA_REGISTRYINDEX, ref);
+ lua_pushinteger(L, res);
return res;
}
@@ -130,6 +216,9 @@ static int lua_CreateServiceFunction(lua_State *L)
HANDLE res = ::CreateServiceFunctionObjParam(name, ServiceFunctionObjParam, L, ref);
lua_pushlightuserdata(L, res);
+ Services.insert(res);
+ ServiceRefs.insert(new HandleRefParam(L, res, ref));
+
return 1;
}
@@ -137,6 +226,16 @@ static int lua_DestroyServiceFunction(lua_State *L)
{
HANDLE hService = (HANDLE)lua_touserdata(L, 1);
+ Services.remove(hService);
+
+ HandleRefParam *param = (HandleRefParam*)ServiceRefs.find(hService);
+ if (param != NULL)
+ {
+ luaL_unref(param->L, LUA_REGISTRYINDEX, param->ref);
+ ServiceRefs.remove(param);
+ delete param;
+ }
+
int res = ::DestroyServiceFunction(hService);
lua_pushinteger(L, res);
diff --git a/plugins/MirLua/src/mlua.cpp b/plugins/MirLua/src/mlua.cpp
index f42f0fecdb..90c5e302c6 100644
--- a/plugins/MirLua/src/mlua.cpp
+++ b/plugins/MirLua/src/mlua.cpp
@@ -41,12 +41,13 @@ void CMLua::Unload()
{
mir_writeLogT(hLogger, _T("Unloading lua engine\n"));
- if (L)
- lua_close(L);
KillModuleMenus(hScriptsLangpack);
+ KillModuleServices();
+ KillModuleEventHooks();
//KillModuleSubclassing
- //KillModuleServices
- //KillModuleEventHooks
+
+ if (L)
+ lua_close(L);
}
void CMLua::Reload()
diff --git a/plugins/MirLua/src/mlua.h b/plugins/MirLua/src/mlua.h
index f98d8f0d4e..81bdbdb177 100644
--- a/plugins/MirLua/src/mlua.h
+++ b/plugins/MirLua/src/mlua.h
@@ -8,6 +8,9 @@ private:
HANDLE hLogger;
CMLuaConsole *console;
+ static void KillModuleServices();
+ static void KillModuleEventHooks();
+
void Load();
void Unload();
diff --git a/plugins/MirLua/src/mlua_console.cpp b/plugins/MirLua/src/mlua_console.cpp
index 1a4fc5da1b..428e43f585 100644
--- a/plugins/MirLua/src/mlua_console.cpp
+++ b/plugins/MirLua/src/mlua_console.cpp
@@ -1,6 +1,6 @@
#include "stdafx.h"
-BOOL WINAPI ConsoleHandler(DWORD cEvent)
+BOOL WINAPI ConsoleHandler(DWORD)
{
return TRUE;
}
diff --git a/plugins/MirLua/src/version.h b/plugins/MirLua/src/version.h
index 986c83b880..bd01214dc9 100644
--- a/plugins/MirLua/src/version.h
+++ b/plugins/MirLua/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 11
#define __RELEASE_NUM 0
-#define __BUILD_NUM 1
+#define __BUILD_NUM 2
#include <stdver.h>