Formidastic, now when nillifying the Test1 and Test 3, the destructor of the SCHEDULER is called

The references of nillified and garbage collected SCHEDULERS are removed
from the _TIMERDISPATCHER. This results now in schedules that are still
pending to be executed, but are nillified, that these schedules will
never be executed!!!

Sven
This commit is contained in:
FlightControl
2016-12-12 17:41:58 +01:00
parent b81b483f0b
commit 15134d7f4e
4 changed files with 34 additions and 22 deletions

View File

@@ -69,11 +69,17 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg
self.StartTime = timer.getTime() self.StartTime = timer.getTime()
_TIMERDISPATCHER:AddSchedule( self ) self.CallID = _TIMERDISPATCHER:AddSchedule( self )
return self return self
end end
function SCHEDULER:_Destructor()
--self:E("_Destructor")
_TIMERDISPATCHER:RemoveSchedule( self.CallID )
end
@@ -89,4 +95,3 @@ end

View File

@@ -33,30 +33,26 @@ end
-- @param #TIMER self -- @param #TIMER self
-- @param Core.Scheduler#SCHEDULER Scheduler -- @param Core.Scheduler#SCHEDULER Scheduler
function TIMER:AddSchedule( Scheduler ) function TIMER:AddSchedule( Scheduler )
self:F3( { Scheduler = Scheduler } ) self:F3( { Scheduler } )
-- Initialize the Functions array, which is a weakly coupled table. -- Initialize the Functions array, which is a weakly coupled table.
-- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array.
self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "k" } ) self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "v" } )
self.CallID = self.CallID + 1 self.CallID = self.CallID + 1
self.Schedulers[Scheduler] = self.CallID self.Schedulers[self.CallID] = Scheduler
self:E(self.Schedulers) Scheduler:E( { self.CallID, self.Schedulers[self.CallID] } )
self.Schedule = self.Schedule or setmetatable( {}, { __mode = "v" } ) self.Schedule = self.Schedule or setmetatable( {}, { __mode = "v" } )
self.Schedule[self.CallID] = {} self.Schedule[self.CallID] = {}
self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001
self.Schedule[self.CallID].ScheduleFunction = Scheduler.TimeEventFunction
self.Schedule[self.CallID].ScheduleArguments = Scheduler.TimeEventFunctionArguments
self.Schedule[self.CallID].ScheduleObject = Scheduler.TimeEventObject
self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001 self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001
self:E( self.Schedule[self.CallID] ) self:E( self.Schedule[self.CallID] )
local function ScheduleCallHandler( CallID ) self.Schedule[self.CallID].ScheduleCallHandler = function( CallID )
self:E( CallID )
local ErrorHandler = function( errmsg ) local ErrorHandler = function( errmsg )
env.info( "Error in timer function: " .. errmsg ) env.info( "Error in timer function: " .. errmsg )
@@ -66,11 +62,9 @@ function TIMER:AddSchedule( Scheduler )
return errmsg return errmsg
end end
BASE:E( { self } ) local ScheduleFunction = self.Schedulers[CallID].TimeEventFunction
local ScheduleArguments = self.Schedulers[CallID].TimeEventFunctionArguments
local ScheduleFunction = self.Schedule[CallID].ScheduleFunction local ScheduleObject = self.Schedulers[CallID].TimeEventObject
local ScheduleArguments = self.Schedule[CallID].ScheduleArguments
local ScheduleObject = self.Schedule[CallID].ScheduleObject
local Status, Result local Status, Result
if ScheduleObject then if ScheduleObject then
@@ -87,7 +81,7 @@ function TIMER:AddSchedule( Scheduler )
end end
timer.scheduleFunction( timer.scheduleFunction(
ScheduleCallHandler, self.Schedule[self.CallID].ScheduleCallHandler,
self.CallID, self.CallID,
timer.getTime() + 1 timer.getTime() + 1
) )
@@ -100,5 +94,12 @@ function TIMER:AddSchedule( Scheduler )
return self.CallID return self.CallID
end end
function TIMER:RemoveSchedule( CallID )
self:F( CallID )
self.Schedulers[CallID] = nil
end

View File

@@ -42,15 +42,21 @@ end
do do
local Test1 = TEST_BASE:New( "Hello World Test 1" ) local Test1 = TEST_BASE:New( "Hello World Test 1" )
Test1 = nil
BASE:E( Test1 )
end end
local Test2 = TEST_BASE:New( "Hello World Test 2" ) local Test2 = TEST_BASE:New( "Hello World Test 2" )
Test2 = nil
local Test3 = TEST_BASE:New( "Hello World Test 3" ) local Test3 = TEST_BASE:New( "Hello World Test 3" )
Test3 = nil
collectgarbage() collectgarbage()
BASE:E( Test2 )
BASE:E( Test3 )
BASE:E( "Collect Garbage executed." ) BASE:E( "Collect Garbage executed." )
BASE:E( "You should only now see Test 3!" ) BASE:E( "You should only see a Hello Worlld message for Test 2!" )
BASE:E( "Check if Test 1 and Test 2 are garbage collected!" ) BASE:E( "Check if Test 1 and Test 3 are garbage collected!" )