From 15134d7f4edd618a3b7ded8fa58f99529ec1904b Mon Sep 17 00:00:00 2001 From: FlightControl Date: Mon, 12 Dec 2016 17:41:58 +0100 Subject: [PATCH] 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 --- Moose Development/Moose/Core/Scheduler.lua | 9 ++++- Moose Development/Moose/Core/Timer.lua | 35 +++++++++--------- ...-002 - No Object Scheduling because GC.lua | 12 ++++-- ...-002 - No Object Scheduling because GC.miz | Bin 18142 -> 18167 bytes 4 files changed, 34 insertions(+), 22 deletions(-) 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 d0650c90e6915c37dead5f4ad87990a27e1fffc5..8707c5c492ffa14fabe538d19efe05ae614177e8 100644 GIT binary patch delta 851 zcmV-Z1FZbsjRE(K0k8=y4jg?(k-h=|0C)xf06GAZUqw8BjZ{r<+CUJ!Bk><5R{1bF7n+czIOqtOVq3htkN zAh(e40<%h#at}|)S!EDZ4tu7b*dBo^AsmXytPYT+5M^F+W=kc<-43z&ulao5zAP$R zC_RIZqTCmMcB!P*N_fwTS%jrV`pIT6nZgP=Oy5o3JFiDvLsHtx)BE=ag9dDYkZQ)A z&b*S`c@5-R9pJ+vS;MikMJYXOwM@oB5v&wAhGl{L=RbDHmG(xBrV`eKJc2A>An^#v z@^-y?_`KeM@`*>tCEZB{7LcN`5e}sR9?}eujW@-A>R|?1sR<_j0Lv`~F|ij21vAtQ zl<-S1DQkwbK#gDuRf&w;AQhN8A}6*Mb|$0^xacZoSFQN;c9Q^o7VvewdxXv1m-}71 z*rt%Klk^049k@B8uFP8VWb9_Dk<*^(gUQc&(1y>pc@+CkpS~NE)Ai()PV^2u;KwKx_EeWm6BLrr_ot1b!bK zRMryuaWxFj4|h*+%+~!&7d3PU&yDqE2ongN2+(LNE&Xxb4xwGWGS$?KL{3QDMe@DV zp82*+dN3g38c*}n?RY#%3dTW0-%?NCLOl)C=aDyWiM(k=-PEGGop>wbCG8KK?NsVV z)JZ)x+`t*8w~WjBQ@rN*8+qmSPwzCc_o%9Ro|UBiW6-Uw& z^H^kmUqWiY^lOWT!v6wLO9KRxp+y?A7B9sC1o2&GnzP?9MF<1*Gp@5IIUEcL9DPQS zz5)OMc#}*;c>)nHlgC9v0y;30Jun)RCPok&@m*({A_)KhX+Qt~2LJ#7000000RR91 d008EbQARWYEt7^uGy(RLyG9)br$Yb$006M0j)edK delta 835 zcmV-J1HAnAjRD?`0k8=y4rht(?xg|%038MZ06GAZctt#ajZ|H4+AtJ-N8&%+(ie~b z4Jz#ci3b+ginP*+q?`IQxz0`E&DfLeh)q@h`}~yzSSK|?K<+)~`uN^sPbL%CNw|Od zfz&`sE6i)oLSbB7`#ZwP{M&I(3}VNy){JzLFxEtkvgWmTI> zss()HtgK9bB85?s`^=gcghZkJ$rmu2!x|~f-_72;tVdi!%1rIc`}YTp8cc%4X2@hK*>6A+gV;rZDR7ijR6Nf@7A5^GoZgkj3kOc$;9wAL` zH|vMbn>|Rs@d&vrchZ3sWT;Jq1JgjmHUnhqL$P~*m_yE#h4DW?3WGsRoCQKfw4DYD z_{E73O@*vNg`g{0^W3IENYD+Vu+=))nUIcfF;&d3I`P@?}%zt&-f5&L8xt*Xq9MJmD z;m^!}_gazY0WE7qaqN9-T$+@G#gg`MYA&@3d2IE1-Ys%2;hR)8*=e&QFVTrnvM#I3 z^{1zeN)0i!UO<|y_St3)lXJWGdt6e&eS^Py6EESp-*fsBPPE>U1KQA_%@4*d`{KU( zz2*>f^u-R3L%2h&-Hb;LrjZx6gwJk;wGT6YLmwPN%NPY{1E0FxG)7dG+@6C_-?M|t zM#3;&4de60-4hav&G0g12Rer5Hu^G#8H7v(C^WSaez|_nqFujo+4jteoLO-fn;)Fc z%#UR@fDyC>I`aH2gyurDC$wcEhbvkx!j0R+cdl#a9b zFhvLhpfRnpKsg)?31^A!?xg|%03DNMMR@}FE|cIzLjfU^Bt|P6$6Az*A_)KhX+Qt~ z2LJ#7000000RR91007OCYDP2x6qBDuG$h?X004Jka%E_5b#rBNP)h{{000003;+xO NIs*Uzjza(d000z(et7@@