Browse Source

do not allocate memory for sigaltstack on every InstallSignals call

Alexander Shiryaev 12 years ago
parent
commit
d07ee7a7de

BIN
BlackBox/Linux/Lin/Mod/Kernel.odc


+ 19 - 14
BlackBox/Linux/Lin/Mod/Kernel.txt

@@ -65,6 +65,8 @@ MODULE Kernel;
 		debug = FALSE;
 
 
+		sigStackSize = MAX(Libc.SIGSTKSZ, 65536);
+
 		trapReturn = 1; (* Return value for sigsetjmp given from siglongjmp *)
 
 		(* constants for the message boxes *) 
@@ -261,6 +263,9 @@ MODULE Kernel;
 
 		watcher*: PROCEDURE (event: INTEGER);	(* for debugging *)
 
+
+		sigStack: Libc.PtrVoid;
+		
 		zerofd: INTEGER;
 		pageSize: INTEGER;
 
@@ -1873,24 +1878,18 @@ MODULE Kernel;
 	END TrapHandler;
 
 	PROCEDURE InstallSignals*;
-		CONST
-			sigStackSize = Libc.SIGSTKSZ + 32768; (* SIGSTKSZ=8192 on Linux is too low *)
 		VAR sa, old: Libc.sigaction_t; res, i: INTEGER;
 			sigstk: Libc.stack_t;
 			errno: INTEGER;
 	BEGIN
 		(* A. V. Shiryaev: Set alternative stack on which signals are to be processed *)
-			sigstk.ss_sp := Libc.calloc(1, sigStackSize);
-			IF sigstk.ss_sp # Libc.NULL THEN
-				sigstk.ss_size := sigStackSize;
-				sigstk.ss_flags := 0;
-				res := Libc.sigaltstack(sigstk, NIL);
-				IF res # 0 THEN Msg("ERROR: Kernel.InstallSignals: sigaltstack failed!");
-					S.GET( Libc.__errno_location(), errno );
-					Int(errno);
-					Libc.exit(1)
-				END
-			ELSE Msg("ERROR: malloc(SIGSTKSIZE) failed");
+			sigstk.ss_sp := sigStack;
+			sigstk.ss_size := sigStackSize;
+			sigstk.ss_flags := 0;
+			res := Libc.sigaltstack(sigstk, NIL);
+			IF res # 0 THEN Msg("ERROR: Kernel.InstallSignals: sigaltstack failed!");
+				S.GET( Libc.__errno_location(), errno );
+				Int(errno);
 				Libc.exit(1)
 			END;
 
@@ -1909,7 +1908,7 @@ MODULE Kernel;
 		IF LinLibc.sigaction(LinLibc.SIGTERM, sa, old) # 0 THEN Msg("failed to install SIGTERM") END;
 		*)
 		(* respond to all possible signals *)
-		FOR i := 1 TO Libc._NSIG - 1 DO 
+		FOR i := 1 TO Libc._NSIG - 1 DO
 			IF (i # Libc.SIGKILL)
 				& (i # Libc.SIGSTOP)
 				& (i # Libc.SIGWINCH)
@@ -1922,6 +1921,12 @@ MODULE Kernel;
 	PROCEDURE Init;
 		VAR i: INTEGER;
 	BEGIN
+		(* for sigaltstack *)
+			sigStack := Libc.calloc(1, sigStackSize);
+			IF sigStack = Libc.NULL THEN
+				Msg("ERROR: Kernel.Init: calloc(1, sigStackSize) failed!");
+				Libc.exit(1)
+			END;
 		(* for mmap *)
 			zerofd := Libc.open("/dev/zero", Libc.O_RDWR, {0..8});
 			IF zerofd < 0 THEN

BIN
BlackBox/Linux/libBB.so


BIN
BlackBox/Linux/libBB0.so


BIN
BlackBox/OpenBSD/Lin/Mod/Kernel.odc


+ 20 - 15
BlackBox/OpenBSD/Lin/Mod/Kernel.txt

@@ -65,6 +65,8 @@ MODULE Kernel;
 		debug = FALSE;
 
 
+		sigStackSize = MAX(Libc.SIGSTKSZ, 65536);
+
 		trapReturn = 1; (* Return value for sigsetjmp given from siglongjmp *)
 
 		(* constants for the message boxes *) 
@@ -262,6 +264,8 @@ MODULE Kernel;
 		watcher*: PROCEDURE (event: INTEGER);	(* for debugging *)
 
 
+		sigStack: Libc.PtrVoid;
+		
 		loopContext: Libc.sigjmp_buf; (* trap return context, if no Kernel.Try has been used. *)
 		currentTryContext: POINTER TO Libc.sigjmp_buf; (* trap return context, if Kernel.Try has been used. *)
 		
@@ -1962,24 +1966,18 @@ MODULE Kernel;
 	END TrapHandler;
 
 	PROCEDURE InstallSignals*;
-		CONST
-			sigStackSize = Libc.SIGSTKSZ;
 		VAR sa, old: Libc.sigaction_t; res, i: INTEGER;
 			sigstk: Libc.sigaltstack_t;
-			 errno: INTEGER;
+			errno: INTEGER;
 	BEGIN
 		(* A. V. Shiryaev: Set alternative stack on which signals are to be processed *)
-			sigstk.ss_sp := Libc.calloc(1, sigStackSize);
-			IF sigstk.ss_sp # Libc.NULL THEN
-				sigstk.ss_size := sigStackSize;
-				sigstk.ss_flags := 0;
-				res := Libc.sigaltstack(sigstk, NIL);
-				IF res # 0 THEN Msg("ERROR: Kernel.InstallSignals: sigaltstack failed!");
-					S.GET( Libc.__errno_location(), errno );
-					Int(errno);
-					Libc.exit(1)
-				END
-			ELSE Msg("ERROR: malloc(SIGSTKSIZE) failed");
+			sigstk.ss_sp := sigStack;
+			sigstk.ss_size := sigStackSize;
+			sigstk.ss_flags := 0;
+			res := Libc.sigaltstack(sigstk, NIL);
+			IF res # 0 THEN Msg("ERROR: Kernel.InstallSignals: sigaltstack failed!");
+				S.GET( Libc.__errno_location(), errno );
+				Int(errno);
 				Libc.exit(1)
 			END;
 
@@ -1998,7 +1996,7 @@ MODULE Kernel;
 		IF LinLibc.sigaction(LinLibc.SIGTERM, sa, old) # 0 THEN Msg("failed to install SIGTERM") END;
 		*)
 		(* respond to all possible signals *)
-		FOR i := 1 TO Libc._NSIG - 1 DO 
+		FOR i := 1 TO Libc._NSIG - 1 DO
 			IF (i # Libc.SIGKILL)
 				& (i # Libc.SIGSTOP)
 				& (i # Libc.SIGWINCH)
@@ -2012,6 +2010,13 @@ MODULE Kernel;
 	PROCEDURE Init;
 		VAR i: INTEGER;
 	BEGIN
+		(* for sigaltstack *)
+			sigStack := Libc.calloc(1, sigStackSize);
+			IF sigStack = Libc.NULL THEN
+				Msg("ERROR: Kernel.Init: calloc(1, sigStackSize) failed!");
+				Libc.exit(1)
+			END;
+
 		InstallSignals; (* init exception handling *)
 		currentTryContext := NIL;
 

BIN
BlackBox/OpenBSD/libBB.so


BIN
BlackBox/OpenBSD/libBB0.so


+ 0 - 1
README

@@ -58,7 +58,6 @@ Files:
 				mmap: use "/dev/zero" device instead of -1
 				mprotect addresses must be page-aligned
 				do not show warning message if signal install failed
-				sigStkSize increased, because SIGSTKSZ=8192 on Linux is too low
 		OpenBSD/Lin/Mod/linHostFiles.odc:
 			OpenBUGS Lin/Mod/linHostFiles.odc:
 				OpenBSD-specific: