2
0
Эх сурвалжийг харах

fixed a possible deadlock while heapspace got expanded

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6634 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 9 жил өмнө
parent
commit
feba7ecdfd

+ 0 - 2
source/Unix.Heaps.Mod

@@ -698,9 +698,7 @@ VAR
 	PROCEDURE Collect;
 	BEGIN
 		thruput := 0;
-		Machine.Acquire( Machine.GC );
 		Machine.Release( Machine.Heaps );
-		Machine.Release( Machine.GC );
 		GC;
 		Machine.Acquire( Machine.Heaps );
 	END Collect;

+ 22 - 2
source/Unix.I386.Machine.Mod

@@ -6,7 +6,7 @@ IMPORT S := SYSTEM, Trace, Unix, Glue;
 CONST
 	DefaultConfig = "Color 0  StackSize 128";
 	
-	Version = "Aos (rev.6559)";
+	Version = "Aos (rev.6634)";
 
 	DefaultObjectFileExtension* = ".Obj";
 	
@@ -31,7 +31,7 @@ CONST
 	KernelLog* = 7;		(* Atomic output *)
 	X11* = 8;				(* XWindows I/O *)
 	Trap* = 9;
-	GC* = 10;
+	GC = 10;
 	MaxLocks* = 11;   (* { <= 32 } *)
 	
 	MaxCPU* = 4;
@@ -75,6 +75,8 @@ VAR
 	SSE5Support-	: BOOLEAN;
 	AVXSupport-		: BOOLEAN;
 	
+	GCacquired- : BOOLEAN;
+	
 	ticks-: LONGINT;	(** timer ticks. Use Kernel.GetTicks() to read, don't write *)
 	
 	prioLow-, prioHigh-: LONGINT;	(* permitted thread priorities *)
@@ -111,6 +113,7 @@ VAR
 	traceHeap: BOOLEAN;
 	
 	timer0	: HUGEINT;
+	
 
 
 	(** Return current processor ID (0 to MaxNum-1). *)
@@ -659,6 +662,23 @@ END GetTimer;
 		mtxUnlock( mtx[level] );
 	END Release;  
 	
+	PROCEDURE  AcquireGC*( ): BOOLEAN;  
+	VAR res: BOOLEAN;
+	BEGIN 
+		mtxLock( mtx[GC] );
+		IF ~GCacquired THEN  GCacquired := TRUE;  res := TRUE  ELSE  res := FALSE  END;
+		mtxUnlock( mtx[GC] );
+		RETURN  res
+	END AcquireGC;  
+
+	(** Release a spin-lock. *)
+	PROCEDURE  ReleaseGC*;   
+	BEGIN 
+		mtxLock( mtx[GC] );
+		GCacquired := FALSE;
+		mtxUnlock( mtx[GC] )
+	END ReleaseGC;  
+	
 	PROCEDURE Shutdown*( reboot: BOOLEAN );
 	VAR ignore: LONGINT;
 	BEGIN

+ 5 - 4
source/Unix.Objects.Mod

@@ -180,7 +180,7 @@ TYPE
 					n.finalizer(n.objStrong)	(* may acquire locks *)
 				END;
 			END;
-			Machine.Release( Machine.GC )
+			Machine.ReleaseGC
 		END
 	END FinalizerCaller;
 	
@@ -674,9 +674,10 @@ TYPE
 	
 	PROCEDURE InvokeGC;
 	BEGIN
-		Machine.Acquire( Machine.GC ); (* gets released by FinalizerCaller *)
-		collect := TRUE;
-		conWait( gcFinished, igc );
+		IF Machine.AcquireGC() THEN (* gets released by FinalizerCaller *)
+			collect := TRUE;
+			conWait( gcFinished, igc )
+		END;
 	END InvokeGC;
 	
 	(*!	GCLoop gets called as last procedure in BootConsole (main thread). 

+ 2 - 2
source/Unix.UnixFiles.Mod

@@ -4,7 +4,7 @@ MODULE UnixFiles;   (** AUTHOR "gf"; PURPOSE "Unix file systems" *)
 
 (*  derived fron (SPARCOberon) Files.Mod by J. Templ 1.12. 89/14.05.93 *)
 
-IMPORT S := SYSTEM, Unix, Machine, Heaps, Kernel, Modules, Log := KernelLog, Files;
+IMPORT S := SYSTEM, Unix, Machine, Heaps, Objects, Kernel, Modules, Log := KernelLog, Files;
 
 
 CONST
@@ -859,7 +859,7 @@ TYPE
 	PROCEDURE AwaitFinalizingDone;
 	BEGIN
 		(* wait until finalizers have finished! (Cleanup)*)
-		Machine.Acquire( Machine.GC );  Machine.Release( Machine.GC )
+		WHILE Machine.GCacquired DO  Objects.Sleep( 10 )  END
 	END AwaitFinalizingDone;
 
 	PROCEDURE ResetBuffers( f: File;  VAR stat: Unix.Status );