Skip to content

Commit

Permalink
LuaFAR: LF_ExitFAR(), после вызова export.ExitFAR(), удаляет все неза…
Browse files Browse the repository at this point in the history
…крытые таймеры (если таковые имеются), что предотвращает падения: (1) на выходе из Far и (2) при пересоздании lua_State с помощью _G.RecreateLuaState=true.
  • Loading branch information
shmuz committed Jun 14, 2016
1 parent b64df6e commit 43f47af
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 8 deletions.
2 changes: 1 addition & 1 deletion plugins/luamacro/_globalinfo.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function export.GetGlobalInfo()
return {
Version = { 1, 0, 0, 573 },
Version = { 1, 0, 0, 574 },
MinFarVersion = { 3, 0, 0, 4582 },
Guid = win.Uuid("4EBBEFC8-2084-4B7F-94C0-692CE136894D"),
Title = "LuaMacro",
Expand Down
10 changes: 8 additions & 2 deletions plugins/luamacro/changelog
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
shmuel 11.06.2016 20:36:21 +0200 - build 573
shmuel 14.06.2016 12:35:08 +0200 - build 574

1. LuaFAR: LF_ExitFAR(), после вызова export.ExitFAR(), удаляет все незакрытые таймеры (если таковые
имеются), что предотвращает падения: (1) на выходе из Far и (2) при пересоздании lua_State
с помощью _G.RecreateLuaState=true.

shmuel 11.06.2016 20:36:21 +0200 - build 573

1. LuaFAR: экспериментальная альтернативная реализация far.Timer и свойств/методов объекта таймера.
(Как побочное явление данной реализации, LuaFAR больше не поддерживает Windows 2000).
(Как побочное явление данной реализации, LuaFAR больше не поддерживает Windows 2000).

shmuel 08.06.2016 15:00:53 +0200 - build 572

Expand Down
7 changes: 7 additions & 0 deletions plugins/luamacro/luafar/exported.c
Original file line number Diff line number Diff line change
Expand Up @@ -1222,10 +1222,17 @@ intptr_t LF_SetFindList(lua_State* L, const struct SetFindListInfo *Info)

void LF_ExitFAR(lua_State* L, const struct ExitInfo *Info)
{
HANDLE TimerQueue = NULL;
(void)Info;

if(GetExportFunction(L, "ExitFAR")) //+1: Func
pcall_msg(L, 0, 0); //+0

lua_getfield(L, LUA_REGISTRYINDEX, LREG_FARTIMERQUEUE); //+1
TimerQueue = lua_touserdata(L, -1);
lua_pop(L, 1); //+0
if (TimerQueue)
DeleteTimerQueueEx(TimerQueue, NULL);
}

void getPluginMenuItems(lua_State* L, struct PluginMenuItem *pmi, const char* namestrings,
Expand Down
17 changes: 14 additions & 3 deletions plugins/luamacro/luafar/service.c
Original file line number Diff line number Diff line change
Expand Up @@ -5247,7 +5247,7 @@ void CALLBACK TimerCallback(void *lpParameter, BOOLEAN TimerOrWaitFired)
(void)TimerOrWaitFired;
if (td->needClose)
{
DeleteTimerQueueTimer(NULL, td->hnd, NULL);
DeleteTimerQueueTimer(td->hQueue, td->hTimer, NULL);
sd = CreateSynchroData(td, LUAFAR_TIMER_UNREF, 0);
td->Info->AdvControl(td->PluginGuid, ACTL_SYNCHRO, 0, sd);
}
Expand Down Expand Up @@ -5297,7 +5297,11 @@ static int far_Timer(lua_State *L)
td->needClose = 0;
td->enabled = 1;

if (CreateTimerQueueTimer(&td->hnd,NULL,TimerCallback,td,td->interval,td->interval,WT_EXECUTEDEFAULT))
lua_getfield(L, LUA_REGISTRYINDEX, LREG_FARTIMERQUEUE);
td->hQueue = lua_touserdata(L, -1);
lua_pop(L, 1);

if (td->hQueue && CreateTimerQueueTimer(&td->hTimer,td->hQueue,TimerCallback,td,td->interval,td->interval,WT_EXECUTEDEFAULT))
return 1;

luaL_unref(L, LUA_REGISTRYINDEX, td->tabRef);
Expand Down Expand Up @@ -5373,7 +5377,7 @@ static int timer_newindex(lua_State *L)
{
int interval = (int)luaL_checkinteger(L, 3);
td->interval = interval < 1 ? 1 : interval;
ChangeTimerQueueTimer(NULL, td->hnd, td->interval, td->interval);
ChangeTimerQueueTimer(td->hQueue, td->hTimer, td->interval, td->interval);
}
else if(!strcmp(method, "OnTimer"))
{
Expand Down Expand Up @@ -5961,6 +5965,13 @@ end";

static int luaopen_far(lua_State *L)
{
HANDLE TimerQueue = CreateTimerQueue();
if (TimerQueue)
{
lua_pushlightuserdata(L, TimerQueue);
lua_setfield(L, LUA_REGISTRYINDEX, LREG_FARTIMERQUEUE);
}

lua_newtable(L);
lua_setfield(L, LUA_REGISTRYINDEX, FAR_DN_STORAGE);

Expand Down
4 changes: 3 additions & 1 deletion plugins/luamacro/luafar/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ _CRTIMP unsigned int __cdecl __MINGW_NOTHROW _control87 (unsigned int unNew, uns

#define LUAFAR_TIMER_CALL 0x1
#define LUAFAR_TIMER_UNREF 0x2
#define LREG_FARTIMERQUEUE "FarTimerQueue"

typedef struct
{
Expand All @@ -39,7 +40,8 @@ typedef struct
int tabRef;
int needClose;
int enabled;
HANDLE hnd;
HANDLE hQueue;
HANDLE hTimer;
} TTimerData;

typedef struct
Expand Down
2 changes: 1 addition & 1 deletion plugins/luamacro/luamacro.rc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <farversion.hpp>

#define PLUGIN_BUILD 573
#define PLUGIN_BUILD 574
#define PLUGIN_DESC "Lua Macros for Far Manager"
#define PLUGIN_NAME "LuaMacro"
#define PLUGIN_FILENAME "luamacro.dll"
Expand Down

0 comments on commit 43f47af

Please sign in to comment.