From e98814e8d463f9f469b003e3d9db8c0926bbe6a1 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Tue, 13 Dec 2016 12:29:28 +0100 Subject: [PATCH] Progress Fixed that schedulers, which are not attached to an object, after garbage collect were removed also from the scheduler dispatcher. The scheduler dispatcher now attaches the schedulers to 2 different tables. - A weak table ObjectSchedulers, which contains scheduler attached to objects. When the object is removed, the scheduler is removed also. - A weak table with PersistentSchedulers, which contains schedulers not attached to objects. These schedulers are persistent, even after garbage collection. I hope this now makes the circle round... --- Moose Development/Moose/Core/Timer.lua | 37 ++++++++++++------ .../SCH-000 - Simple Scheduling.miz | Bin 18147 -> 17770 bytes 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index 96eae1411..3a8254e52 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -4,6 +4,8 @@ -- -- Takes care of scheduled function dispatching for defined in MOOSE classes. -- +-- This function is complicated. +-- -- === -- -- === @@ -37,11 +39,21 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star self.CallID = self.CallID + 1 - -- Initialize the Functions array, which is a weakly coupled table. + -- Initialize the ObjectSchedulers 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.Calls = self.Calls or setmetatable( {}, { __mode = "v" } ) - self.Calls[self.CallID] = Scheduler - Scheduler:E( { self.CallID, self.Calls[self.CallID] } ) + self.PersistentSchedulers = self.PersistentSchedulers or {} + + -- Initialize the ObjectSchedulers 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.ObjectSchedulers = self.ObjectSchedulers or setmetatable( {}, { __mode = "v" } ) + + if Scheduler.TimeEventObject then + self.ObjectSchedulers[self.CallID] = Scheduler + self:T3( { self.CallID, self.ObjectSchedulers[self.CallID] } ) + else + self.PersistentSchedulers[self.CallID] = Scheduler + self:T3( { self.CallID, self.PersistentSchedulers[self.CallID] } ) + end self.Schedule = self.Schedule or setmetatable( {}, { __mode = "k" } ) self.Schedule[Scheduler] = {} @@ -54,10 +66,10 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star self.Schedule[Scheduler][self.CallID].Randomize = Randomize self.Schedule[Scheduler][self.CallID].Stop = Stop - self:E( self.Schedule[Scheduler][self.CallID] ) + self:T3( self.Schedule[Scheduler][self.CallID] ) self.Schedule[Scheduler][self.CallID].CallHandler = function( CallID ) - self:E( CallID ) + self:F3( CallID ) local ErrorHandler = function( errmsg ) env.info( "Error in timer function: " .. errmsg ) @@ -67,15 +79,18 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star return errmsg end - local Scheduler = self.Calls[CallID] + local Scheduler = self.ObjectSchedulers[CallID] + if not Scheduler then + Scheduler = self.PersistentSchedulers[CallID] + end - self:E( { Scheduler = Scheduler } ) + self:T3( { Scheduler = Scheduler } ) - if self.Calls[CallID] then + if Scheduler then local Schedule = self.Schedule[Scheduler][CallID] - self:E( { Schedule = Schedule } ) + self:T3( { Schedule = Schedule } ) local ScheduleObject = Scheduler.TimeEventObject local ScheduleFunction = Schedule.Function @@ -142,7 +157,7 @@ end function TIMER:RemoveSchedule( CallID ) self:F( CallID ) - local Schedule = self.Calls[CallID] + local Schedule = self.ObjectSchedulers[CallID] if Schedule then local ScheduleID = Schedule.ScheduleID diff --git a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz index 2c6329813b8dc751822f0f939c97525be771f7b3..533a2dfda841c2c5e463cb439075d3ac74786eaf 100644 GIT binary patch delta 3296 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 No&f-mHuz`oe*g+UBY*$^ delta 3721 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 uPD2u(O(By`Q