From b79d5028066e3debd4ab1715ab59f572df1b158a Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Thu, 26 May 2016 09:10:16 +0000 Subject: MirLua: m_schedule moved to separate module git-svn-id: http://svn.miranda-ng.org/main/trunk@16871 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MirLua/src/m_schedule.cpp | 639 ------------------------------ plugins/MirLua/src/m_schedule.h | 9 - plugins/MirLua/src/mlua.cpp | 4 +- plugins/MirLua/src/mlua_module_loader.cpp | 1 - plugins/MirLua/src/stdafx.h | 2 - 5 files changed, 1 insertion(+), 654 deletions(-) delete mode 100644 plugins/MirLua/src/m_schedule.cpp delete mode 100644 plugins/MirLua/src/m_schedule.h (limited to 'plugins/MirLua/src') diff --git a/plugins/MirLua/src/m_schedule.cpp b/plugins/MirLua/src/m_schedule.cpp deleted file mode 100644 index c501de84a9..0000000000 --- a/plugins/MirLua/src/m_schedule.cpp +++ /dev/null @@ -1,639 +0,0 @@ -#include "stdafx.h" - -static mir_cs threadLock; -static HANDLE hScheduleEvent = NULL; -static HANDLE hScheduleThread = NULL; - -#define STOP ((void *) -1) - -struct ScheduleTask -{ - time_t timestamp; - time_t interval; - - lua_State *L; - int threadRef; - int callbackRef; -}; - -static int TaskCompare(const ScheduleTask *p1, const ScheduleTask *p2) -{ - return p1->timestamp - p2->timestamp; -} - -static LIST tasks(1, TaskCompare); - -void DestroyTask(ScheduleTask *task) -{ - luaL_unref(task->L, LUA_REGISTRYINDEX, task->callbackRef); - luaL_unref(task->L, LUA_REGISTRYINDEX, task->threadRef); - delete task; -} - -void ExecuteTaskThread(void *arg) -{ - ScheduleTask *task = (ScheduleTask*)arg; - - lua_rawgeti(task->L, LUA_REGISTRYINDEX, task->callbackRef); - luaM_pcall(task->L, 0, 1); - - void* res = lua_touserdata(task->L, -1); - - if (res == STOP || task->interval == 0) - { - DestroyTask(task); - return; - } - - { - mir_cslock lock(threadLock); - - time_t timestamp = time(NULL); - if(task->timestamp + task->interval >= timestamp) - task->timestamp += task->interval; - else - task->timestamp = timestamp + task->interval; - tasks.insert(task); - } - SetEvent(hScheduleEvent); -} - -void ScheduleThread(void*) -{ - time_t waitTime = INFINITE; - - while (true) - { -wait: WaitForSingleObject(hScheduleEvent, waitTime); - - while (ScheduleTask *task = tasks[0]) - { - if (Miranda_Terminated()) - return; - - mir_cslock lock(threadLock); - - time_t timestamp = time(NULL); - if (task->timestamp > timestamp) - { - waitTime = (task->timestamp - timestamp - 1) * 1000; - goto wait; - } - - tasks.remove(task); - - mir_forkthread(ExecuteTaskThread, task); - } - - waitTime = INFINITE; - } -} - -void KillModuleScheduleTasks() -{ - mir_cslock lock(threadLock); - - while (ScheduleTask *task = tasks[0]) - { - tasks.remove(task); - DestroyTask(task); - } -} - -/***********************************************/ - -static time_t luaM_opttimestamp(lua_State *L, int idx, time_t def = 0) -{ - switch (lua_type(L, idx)) - { - case LUA_TNUMBER: - return luaL_optinteger(L, idx, def); - - case LUA_TSTRING: - { - const char *strtime = luaL_optstring(L, idx, "00:00:00"); - - int hour = 0, min = 0, sec = 0; - if (sscanf_s(strtime, "%02d:%02d:%02d", &hour, &min, &sec) >= 2) - { - struct tm *ti = localtime(&def); - ti->tm_hour = hour; - ti->tm_min = min; - ti->tm_sec = sec; - return mktime(ti); - } - } - } - return def; -} - -/***********************************************/ - -static int fluent_Do(lua_State *L) -{ - luaL_checktype(L, 1, LUA_TFUNCTION); - - lua_getfield(L, lua_upvalueindex(1), "Interval"); - int interval = luaL_optinteger(L, -1, 0); - lua_pop(L, 1); - - lua_getfield(L, lua_upvalueindex(1), "Timestamp"); - time_t timestamp = lua_tointeger(L, -1); - lua_pop(L, 1); - - time_t now = time(NULL); - if (timestamp < now) - { - if (interval == 0) - return 0; - timestamp += (((now - timestamp) / interval) + 1) * interval; - } - - lua_pushnil(L); - lua_replace(L, lua_upvalueindex(1)); - - ScheduleTask *task = new ScheduleTask(); - task->timestamp = timestamp; - task->interval = interval; - task->L = lua_newthread(L); - task->threadRef = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushvalue(L, 1); - task->callbackRef = luaL_ref(L, LUA_REGISTRYINDEX); - { - mir_cslock lock(threadLock); - tasks.insert(task); - } - SetEvent(hScheduleEvent); - - return 0; -} - -static int fluent_At(lua_State *L) -{ - time_t timestamp = luaM_opttimestamp(L, 1, 0); - - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t now = time(NULL); - if (timestamp < now) - { - lua_getfield(L, -1, "Interval"); - int interval = luaL_optinteger(L, -1, 0); - lua_pop(L, 1); - if (interval > 0) - timestamp += (((now - timestamp) / interval) + 1) * interval; - } - - lua_pushinteger(L, timestamp); - lua_setfield(L, -2, "Timestamp"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - lua_pushcclosure(L, fluent_Do, 1); - lua_setfield(L, -2, "Do"); - lua_setmetatable(L, -2); - - return 1; -} - -static const luaL_Reg scheduleEvery3Api[] = -{ - { "At", fluent_At }, - { "Do", fluent_Do }, - - { NULL, NULL } -}; - -static int fluent_Second(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_pushinteger(L, 1); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Seconds(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_getfield(L, -1, "Interval"); - int seconds = luaL_optinteger(L, -1, 1); - lua_pop(L, 1); - lua_pushinteger(L, seconds); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Minute(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_pushinteger(L, 60); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Minutes(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_getfield(L, -1, "Interval"); - int interval = luaL_optinteger(L, -1, 1); - lua_pop(L, 1); - lua_pushinteger(L, interval * 60); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Hour(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_pushinteger(L, 60 * 60); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Hours(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_getfield(L, -1, "Interval"); - int interval = luaL_optinteger(L, -1, 1); - lua_pop(L, 1); - lua_pushinteger(L, interval * 60 * 60); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Day(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_pushinteger(L, 60 * 60 * 24); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Days(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_getfield(L, -1, "Interval"); - int interval = luaL_optinteger(L, -1, 1); - lua_pop(L, 1); - lua_pushinteger(L, interval * 60 * 60 * 24); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Week(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Monday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(1 - ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Tuesday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(2 - ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Wednesday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(3 - ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Thursday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(4 - ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Friday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(5 - ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Saturday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(6 - ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int fluent_Sunday(lua_State *L) -{ - lua_pushvalue(L, lua_upvalueindex(1)); - - time_t timestamp = time(NULL); - struct tm *ti = localtime(×tamp); - ti->tm_mday += abs(-ti->tm_wday); - lua_pushinteger(L, mktime(ti)); - lua_setfield(L, -2, "Timestamp"); - lua_pushinteger(L, 60 * 60 * 24 * 7); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, scheduleEvery3Api, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static const luaL_Reg scheduleEvery1Api[] = -{ - { "Second", fluent_Second }, - { "Minute", fluent_Minute }, - { "Hour", fluent_Hour }, - { "Day", fluent_Day }, - { "Week", fluent_Week }, - { "Monday", fluent_Monday }, - { "Tuesday", fluent_Tuesday }, - { "Wednesday", fluent_Wednesday }, - { "Thursday", fluent_Thursday }, - { "Friday", fluent_Friday }, - { "Saturday", fluent_Saturday }, - { "Sunday", fluent_Sunday }, - - { NULL, NULL } -}; - -static const luaL_Reg scheduleEvery2Api[] = -{ - { "Seconds", fluent_Seconds }, - { "Minutes", fluent_Minutes }, - { "Hours", fluent_Hours }, - { "Days", fluent_Days }, - - { NULL, NULL } -}; - -/***********************************************/ - -static int schedule_At(lua_State *L) -{ - time_t timestamp = time(NULL); - time_t startTime = luaM_opttimestamp(L, 1, timestamp); - - lua_newtable(L); - lua_pushinteger(L, startTime); - lua_setfield(L, -2, "Timestamp"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - lua_pushcclosure(L, fluent_Do, 1); - lua_setfield(L, -2, "Do"); - lua_setmetatable(L, -2); - - return 1; -} - -static int schedule_Every(lua_State *L) -{ - int interval = luaL_optinteger(L, 1, 0); - - const luaL_Reg *funcs = lua_isnone(L, 1) - ? scheduleEvery1Api - : scheduleEvery2Api; - - lua_newtable(L); - lua_pushinteger(L, interval); - lua_setfield(L, -2, "Interval"); - - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - lua_pushvalue(L, -2); - luaL_setfuncs(L, funcs, 1); - lua_setmetatable(L, -2); - - return 1; -} - -static int schedule_Do(lua_State *L) -{ - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); - - lua_pushvalue(L, 1); - lua_pushcclosure(L, fluent_Do, 1); - lua_pushvalue(L, 2); - luaM_pcall(L, 1); - - return 0; -} - -static const luaL_Reg scheduleApi[] = -{ - { "At", schedule_At }, - { "Every", schedule_Every }, - { "Do", schedule_Do }, - - { "STOP", NULL }, - - { NULL, NULL } -}; - -/***********************************************/ - -LUAMOD_API int luaopen_m_schedule(lua_State *L) -{ - luaL_newlib(L, scheduleApi); - lua_pushlightuserdata(L, STOP); - lua_setfield(L, -2, "STOP"); - - if (hScheduleEvent == NULL) - hScheduleEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - - if (hScheduleThread == NULL) - hScheduleThread = mir_forkthread(ScheduleThread); - - return 1; -} diff --git a/plugins/MirLua/src/m_schedule.h b/plugins/MirLua/src/m_schedule.h deleted file mode 100644 index 48874dd126..0000000000 --- a/plugins/MirLua/src/m_schedule.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _LUA_M_SCHEDULE_H_ -#define _LUA_M_SCHEDULE_H_ - -#define MLUA_SCHEDULE "m_schedule" -LUAMOD_API int (luaopen_m_schedule)(lua_State *L); - -void KillModuleScheduleTasks(); - -#endif //_LUA_M_SCHEDULE_H_ \ No newline at end of file diff --git a/plugins/MirLua/src/mlua.cpp b/plugins/MirLua/src/mlua.cpp index afa7d7b04c..5f5c2080ce 100644 --- a/plugins/MirLua/src/mlua.cpp +++ b/plugins/MirLua/src/mlua.cpp @@ -87,8 +87,6 @@ void CMLua::Unload() delete script; } - KillModuleScheduleTasks(); - KillModuleIcons(hMLuaLangpack); KillModuleSounds(hMLuaLangpack); KillModuleMenus(hMLuaLangpack); @@ -123,4 +121,4 @@ void CMLua::KillLuaRefs() delete param; } } -} \ No newline at end of file +} diff --git a/plugins/MirLua/src/mlua_module_loader.cpp b/plugins/MirLua/src/mlua_module_loader.cpp index e0777ac136..ad4141f0fa 100644 --- a/plugins/MirLua/src/mlua_module_loader.cpp +++ b/plugins/MirLua/src/mlua_module_loader.cpp @@ -35,7 +35,6 @@ void CMLuaModuleLoader::LoadModules() Preload(MLUA_HOTKEYS, luaopen_m_hotkeys); Preload(MLUA_MESSAGE, luaopen_m_message); Preload(MLUA_PROTOCOLS, luaopen_m_protocols); - Preload(MLUA_SCHEDULE, luaopen_m_schedule); Preload(MLUA_SOUNDS, luaopen_m_sounds); } diff --git a/plugins/MirLua/src/stdafx.h b/plugins/MirLua/src/stdafx.h index 0bd6712d48..d14e5bd116 100644 --- a/plugins/MirLua/src/stdafx.h +++ b/plugins/MirLua/src/stdafx.h @@ -91,8 +91,6 @@ LUAMOD_API int (luaopen_m_message)(lua_State *L); #include "m_protocols.h" -#include "m_schedule.h" - #define MLUA_SOUNDS "m_sounds" LUAMOD_API int (luaopen_m_sounds)(lua_State *L); -- cgit v1.2.3