Selaa lähdekoodia

can et full context of any process interrupted with suspend

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6924 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 vuotta sitten
vanhempi
commit
4686eb4cb8
2 muutettua tiedostoa jossa 28 lisäystä ja 12 poistoa
  1. 12 7
      source/Generic.Linux.I386.Unix.Mod
  2. 16 5
      source/Generic.Unix.Objects.Mod

+ 12 - 7
source/Generic.Linux.I386.Unix.Mod

@@ -352,7 +352,7 @@ TYPE
 				r_ds-		: LONGINT;
 				r_di-		: LONGINT;
 				r_si-		: LONGINT;
-				r_bp-		: LONGINT;
+				r_bp-		: ADDRESS;
 				r_sp_ -	: LONGINT;
 				r_bx-		: LONGINT;
 				r_dx-		: LONGINT;
@@ -399,6 +399,7 @@ VAR
 	sigstack-: ARRAY 32*4096 OF CHAR;
 	
 	ptrace: PROCEDURE {C} (request: WORD; pid: Thread_t; adr, data: ADDRESS): WORD;
+	getcontext-: PROCEDURE {C} (context: ADDRESS): WORD; 
 
 	pthread_mutex_init: PROCEDURE {C} (mutex: ADDRESS; mutexattr: ADDRESS): WORD;
 	pthread_mutex_destroy: PROCEDURE {C} (mutex: ADDRESS): WORD;
@@ -716,6 +717,7 @@ VAR
     PROCEDURE TraceThread*(p: Thread_t);
     VAR regs: PtraceRegsStruct; res: WORD;
     BEGIN
+    
     	TRACE(p, pthread_self());
     	res := ptrace(PTRACE_ATTACH, p , NIL, NIL); 
     	IF res < 0 THEN Perror("attach") END; 
@@ -727,8 +729,7 @@ VAR
     	TRACE(regs.ebp, regs.esp, regs.IP, regs.flags);
     	res := ptrace(PTRACE_DETACH, p, NIL, NIL);
     END TraceThread;
-    
-	
+    	
 	
 PROCEDURE {C} resume_handler(sig: LONGINT);
 BEGIN
@@ -745,10 +746,13 @@ BEGIN
     res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
 END ThrResume;
 
-PROCEDURE {C} suspend_handler(sig: LONGINT);
+VAR suspendMe*: PROCEDURE(c: Ucontext);
+
+PROCEDURE {C} suspend_handler(sig: LONGINT; scp: ADDRESS; ucp: ADDRESS);
 VAR block: Sigset_t; res: LONGINT;
 BEGIN
-	TRACE(sig);
+	TRACE(sig, scp, ucp);
+	IF suspendMe # NIL THEN suspendMe(S.VAL(Ucontext,ucp)) END;
     res := sigfillset( ADDRESS OF block );
     sigdelset(  ADDRESS OF block, T_SIGRESUME );
     suspend_done := 1;
@@ -769,7 +773,7 @@ END ThrSuspend;
 TYPE
 	Sigaction = RECORD
 		sa_handler: ADDRESS;
-		filler1: ADDRESS;
+		(*filler1: ADDRESS;*)
 		sa_mask: Sigset_t;
 		sa_flags: ADDRESS;
 		filler: ADDRESS;
@@ -807,7 +811,7 @@ VAR
 		
 	    sigemptyset( ADDRESS OF sasuspend.sa_mask );
 	    sigaddset(  ADDRESS OF sasuspend.sa_mask, T_SIGRESUME );
-	    sasuspend.sa_flags := 0;
+	    sasuspend.sa_flags := SA_SIGINFO + (*SA_ONSTACK +*) SA_NODEFER;;
 	    sasuspend.sa_handler := suspend_handler;
 	    ASSERT(sigaction( T_SIGSUSPEND, ADDRESS OF sasuspend, NIL ) = 0);
 
@@ -1044,6 +1048,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
 		
 		Dlsym( libc, "ptrace", ADDRESSOF(ptrace));
+		Dlsym( libc, "getcontext", ADDRESSOF(getcontext));
 
 		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init));
 		Dlsym( libc, "pthread_mutex_destroy", ADDRESSOF(pthread_mutex_destroy));

+ 16 - 5
source/Generic.Unix.Objects.Mod

@@ -629,6 +629,14 @@ TYPE
 
 	(*--------------------  Garbage Collection  ------------------------------------*)
 	
+	PROCEDURE SuspendMe(ctxt: Unix.Ucontext);
+	VAR bp: ADDRESS; i: LONGINT; res: LONGINT;
+		
+	BEGIN
+		bp := ctxt.mc.r_bp;
+		TRACE(CurrentProcess(), bp);
+	END SuspendMe;
+	
 	PROCEDURE SuspendActivities;
 	VAR t: Process;  
 	BEGIN
@@ -653,19 +661,22 @@ TYPE
 	VAR t, me: Process;  
 	BEGIN
 		me:= CurrentProcess();
-		TRACE(me, me.threadId);
+		TRACE(me, me.threadId, mainProcess);
 		t := root;
 				
 		WHILE t # NIL DO
-			IF (t # me) & (t # mainProcess) & (t#finCaller) THEN  
+			IF (t # me) (* & (t # mainProcess) & (t#finCaller) *) THEN  
+				Unix.suspendMe := SuspendMe;
 				TRACE(t, t.threadId);
-				Unix.ThrSuspend( t.threadId )  
+				Unix.ThrSuspend( t.threadId ); 
+				(*Unix.TraceThread(t.threadId);*)
 			END;
-			(*Unix.TraceThread(t.threadId);*)
-			IF (t # me) THEN  Unix.ThrResume( t.threadId )  END;
+			(*IF (t # me) THEN  Unix.ThrResume( t.threadId )  END;*)
 			t := t.nextProcess
 		END;
+		
 		ResumeActivities;
+		
 	END TraceAll;