Răsfoiți Sursa

Moved implicit marking into second phase before checking if object has been marked

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8649 8c9fc860-2736-0410-a75d-ab315db34111
negelef 6 ani în urmă
părinte
comite
b1908b1fb4
1 a modificat fișierele cu 4 adăugiri și 6 ștergeri
  1. 4 6
      source/Coop.Heaps.Mod

+ 4 - 6
source/Coop.Heaps.Mod

@@ -195,8 +195,6 @@ BEGIN
 		pointer := SYSTEM.VAL(BaseTypes.Pointer, n.objWeak);
 		IF pointer.cycle - cycle <= 0 THEN
 			IF n = checkRoot THEN checkRoot := n.nextFin ELSE p.nextFin := n.nextFin END;
-			n.objStrong := n.objWeak;	(* anchor the object for finalization *)
-			n.finalizerStrong := n.finalizer; (* anchor the finalizer for finalization *)
 			t := n.nextFin; n.nextFin := finalizeRoot; finalizeRoot := n; n := t;
 			IF Stats THEN DEC(NfinalizeAlive); INC(NfinalizeDead) END
 		ELSE
@@ -207,14 +205,15 @@ BEGIN
 	(* now trace the weak references to keep finalized objects alive during this collection *)
 	n := finalizeRoot;
 	WHILE n # NIL DO
-		MarkDelegate(n.finalizerStrong);
-		Mark(n.objStrong); n := n.nextFin
+		n.objStrong := n.objWeak;	(* anchor the object for finalization *)
+		n.finalizerStrong := n.finalizer; (* anchor the finalizer for finalization *)
+		n := n.nextFin;
 	END;
 
 	n := checkRoot;
 	WHILE n # NIL DO (* list of objects that had been marked before entering CheckFinalizedObjects *)
 		(* we still have to mark the weak finalizers, as they might have not been marked before  *)
-		MarkDelegate(n.finalizer); n := n.nextFin
+		Mark(n.objWeak); MarkDelegate(n.finalizer); n := n.nextFin
 	END;
 
 	Machine.Release(Machine.Heaps);
@@ -546,7 +545,6 @@ PROCEDURE AddFinalizer*(obj: ANY; n: FinalizerNode);
 VAR pointer {UNTRACED}: BaseTypes.Pointer;
 BEGIN
 	pointer := SYSTEM.VAL (BaseTypes.Pointer, obj);
-IF pointer.descriptor = ADDRESS OF File THEN TRACE (obj, n) END;
 	n.objWeak := obj; n.objStrong := NIL; n.finalizerStrong := NIL;
 	Machine.Acquire(Machine.Heaps);
 	n.nextFin := checkRoot; checkRoot := n;