浏览代码

Finally found the problem with traps on several threads: only one signal stack was in use ...
Temporarily activated the common signal stack only for segmentation faults to catch stack overflows (but even here we should not share the same stack for different threads!)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7000 8c9fc860-2736-0410-a75d-ab315db34111

felixf 8 年之前
父节点
当前提交
d0debdb858
共有 2 个文件被更改,包括 7 次插入3 次删除
  1. 6 2
      source/Generic.Linux.I386.Unix.Mod
  2. 1 1
      source/Generic.Unix.Traps.Mod

+ 6 - 2
source/Generic.Linux.I386.Unix.Mod

@@ -996,7 +996,11 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	BEGIN
 		sigemptyset(ADDRESS OF mask);
 		act.sa_mask := mask;
-		act.sa_flags :=  SA_SIGINFO + SA_ONSTACK + SA_NODEFER;
+		IF sig = SIGSEGV THEN (* segmentation violation *)
+			act.sa_flags :=  SA_SIGINFO +  SA_ONSTACK +  SA_NODEFER;
+		ELSE
+			act.sa_flags :=  SA_SIGINFO + (* SA_ONSTACK + *) SA_NODEFER;
+		END;
 		act.sa_handler := ADDRESS OF SigHandler;
 		IF sigaction( sig, ADDRESS OF act, 0 ) # 0 THEN
 			Perror("sigaction");
@@ -1191,7 +1195,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "closedir",	ADDRESSOF( closedir ) );
 
 
-		Dlsym( libp, "__sigsetjmp",	ADDRESSOF( sigsetjmp ) );
+		Dlsym( libc, "__sigsetjmp",	ADDRESSOF( sigsetjmp ) );
 		Dlsym( libc, "siglongjmp",	ADDRESSOF( siglongjmp ) );
 
 

+ 1 - 1
source/Generic.Unix.Traps.Mod

@@ -233,11 +233,11 @@ VAR
 		END;
 		entry := Modules.GetExceptionHandler( pc );
 		WHILE (entry = -1) & (fp <= process.stackBottom) & (fp#0) DO
-			sp := fp;   (* Save the old framepointer into the stack pointer *)
 			fp := CheckBP(fp);
 			S.GET( fp + AddrSize, pc );
 			pc := pc - 1;   (*  CALL instruction, machine dependent!!! *)
 			entry := Modules.GetExceptionHandler( pc );
+			sp := fp;   (* Save the old framepointer into the stack pointer *)
 			S.GET( fp, fp ) (* Unwind PAF *)
 		END;
 		IF entry # -1 THEN