diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index 7c8a1eddb..d8b9a0805 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -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 - diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index a31e67300..174f6f674 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -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 + + diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua index 44e3b4ce9..ee34c7a79 100644 --- a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua +++ b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua @@ -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!" ) \ No newline at end of file +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!" ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz index d0650c90e..8707c5c49 100644 Binary files a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz and b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz differ