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()
_TIMERDISPATCHER:AddSchedule( self )
self.CallID = _TIMERDISPATCHER:AddSchedule( self )
return self
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 Core.Scheduler#SCHEDULER Scheduler
function TIMER:AddSchedule( Scheduler )
self:F3( { Scheduler = Scheduler } )
self:F3( { Scheduler } )
-- 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.
self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "k" } )
self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "v" } )
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.CallID] = {}
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] )
local function ScheduleCallHandler( CallID )
self.Schedule[self.CallID].ScheduleCallHandler = function( CallID )
self:E( CallID )
local ErrorHandler = function( errmsg )
env.info( "Error in timer function: " .. errmsg )
@ -66,11 +62,9 @@ function TIMER:AddSchedule( Scheduler )
return errmsg
end
BASE:E( { self } )
local ScheduleFunction = self.Schedule[CallID].ScheduleFunction
local ScheduleArguments = self.Schedule[CallID].ScheduleArguments
local ScheduleObject = self.Schedule[CallID].ScheduleObject
local ScheduleFunction = self.Schedulers[CallID].TimeEventFunction
local ScheduleArguments = self.Schedulers[CallID].TimeEventFunctionArguments
local ScheduleObject = self.Schedulers[CallID].TimeEventObject
local Status, Result
if ScheduleObject then
@ -87,7 +81,7 @@ function TIMER:AddSchedule( Scheduler )
end
timer.scheduleFunction(
ScheduleCallHandler,
self.Schedule[self.CallID].ScheduleCallHandler,
self.CallID,
timer.getTime() + 1
)
@ -100,5 +94,12 @@ function TIMER:AddSchedule( Scheduler )
return self.CallID
end
function TIMER:RemoveSchedule( CallID )
self:F( CallID )
self.Schedulers[CallID] = nil
end

View File

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