mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
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:
parent
b81b483f0b
commit
15134d7f4e
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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!" )
|
||||
Loading…
x
Reference in New Issue
Block a user