Forráskód Böngészése

thread context stored in suspend -- works

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6925 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 éve
szülő
commit
a2b127fa27

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

@@ -352,18 +352,18 @@ TYPE
 				r_ds-		: LONGINT;
 				r_di-		: LONGINT;
 				r_si-		: LONGINT;
-				r_bp-		: ADDRESS;
-				r_sp_ -	: LONGINT;
+				r_bp *	: ADDRESS;
+				r_sp_ 	: LONGINT;
 				r_bx-		: LONGINT;
 				r_dx-		: LONGINT;
 				r_cx-		: LONGINT;
 				r_ax-		: LONGINT;
 				r_trapno-	: LONGINT;
 				r_err-		: LONGINT;
-				r_pc-		: LONGINT;
+				r_pc *	: LONGINT;
 				r_cs-		: LONGINT;
 				r_flags-	: LONGINT;
-				r_sp-		: LONGINT;		(* sp at error (signal) *)
+				r_sp *	: LONGINT;		(* sp at error (signal) *)
 				r_ss-		: LONGINT;
 				fpc-		: ADDRESS; 	(* FPcontext *)
 				oldmask-	: LONGINT;
@@ -746,13 +746,13 @@ BEGIN
     res := pthread_mutex_unlock( ADDRESS OF suspend_mutex );
 END ThrResume;
 
-VAR suspendMe*: PROCEDURE(c: Ucontext);
+VAR suspendHandler*: PROCEDURE(c: Ucontext);
 
 PROCEDURE {C} suspend_handler(sig: LONGINT; scp: ADDRESS; ucp: ADDRESS);
 VAR block: Sigset_t; res: LONGINT;
 BEGIN
 	TRACE(sig, scp, ucp);
-	IF suspendMe # NIL THEN suspendMe(S.VAL(Ucontext,ucp)) END;
+	IF suspendHandler # NIL THEN suspendHandler(S.VAL(Ucontext,ucp)) END;
     res := sigfillset( ADDRESS OF block );
     sigdelset(  ADDRESS OF block, T_SIGRESUME );
     suspend_done := 1;
@@ -823,6 +823,11 @@ VAR
 	    RETURN TRUE;
 	END ThrInitialize;
 
+	PROCEDURE CopyContext*(CONST from: McontextDesc; VAR to: McontextDesc);
+	BEGIN
+		S.MOVE(ADDRESS OF from, ADDRESS OF to, SIZE OF McontextDesc);
+	END CopyContext;
+	
 
 	PROCEDURE ModifyContext*( cont: Ucontext;  pc, bp, sp: LONGINT );
 	BEGIN

+ 9 - 44
source/Generic.Unix.Objects.Mod

@@ -170,10 +170,10 @@ TYPE
 	
 	Process* = OBJECT (Heaps.ProcessLink)
 	VAR
-		threadId			: Unix.Thread_t;
+		threadId-			: Unix.Thread_t;
 		nextProcess-	: Process;	(* next in list of all processes *)
 		stackBottom	-	: ADDRESS;
-		SP-				: ADDRESS;	(* SP value at last NEW *)
+		context*: Unix.McontextDesc;
 		id-				: LONGINT;
 		body			: Body;
 		mode-		: LONGINT;
@@ -194,7 +194,7 @@ TYPE
 		VAR sp, ptr: ADDRESS;
 		BEGIN
 			IF mode # Terminated THEN
-				sp := SP;
+				sp := context.r_sp;
 				WHILE sp < stackBottom DO  
 					S.GET( sp, ptr );  
 					IF (ptr # 0) & (ptr MOD 8 = 0) THEN  Heaps.Candidate( ptr )  END;  
@@ -256,7 +256,6 @@ TYPE
 			ELSE 
 				(* first process *)
 				stackBottom := Glue.stackBottom;  
-				SP := Machine.CurrentSP( );
 				threadId := Unix.ThrThis(0);
 				id := 0;  nextPID := 1;
 				root := SELF;
@@ -276,7 +275,6 @@ TYPE
 			p := newProcess;  newProcess := NIL;
 			p.threadId := Unix.ThrThis(0);  
 			p.id := nextPID;  INC( nextPID );
-			p.SP := Machine.CurrentSP(  );  
 			p.stackBottom := Machine.CurrentBP( );
 			S.GET( p.stackBottom, prevBP );
 			S.PUT( prevBP, S.VAL( ADDRESS, 0 ) );	(* for terminating Reflection.StackTraceBack *)
@@ -629,13 +627,12 @@ TYPE
 
 	(*--------------------  Garbage Collection  ------------------------------------*)
 	
-	PROCEDURE SuspendMe(ctxt: Unix.Ucontext);
-	VAR bp: ADDRESS; i: LONGINT; res: LONGINT;
-		
+	PROCEDURE GetContext(ctxt: Unix.Ucontext);
+	VAR t: Process;
 	BEGIN
-		bp := ctxt.mc.r_bp;
-		TRACE(CurrentProcess(), bp);
-	END SuspendMe;
+		t := CurrentProcess();
+		Unix.CopyContext(ctxt.mc, t.context);
+	END GetContext;
 	
 	PROCEDURE SuspendActivities;
 	VAR t: Process;  
@@ -657,39 +654,6 @@ TYPE
 		END;
 	END ResumeActivities;
 	
-	PROCEDURE TraceAll*;
-	VAR t, me: Process;  
-	BEGIN
-		me:= CurrentProcess();
-		TRACE(me, me.threadId, mainProcess);
-		t := root;
-				
-		WHILE t # NIL DO
-			IF (t # me) (* & (t # mainProcess) & (t#finCaller) *) THEN  
-				Unix.suspendMe := SuspendMe;
-				TRACE(t, t.threadId);
-				Unix.ThrSuspend( t.threadId ); 
-				(*Unix.TraceThread(t.threadId);*)
-			END;
-			(*IF (t # me) THEN  Unix.ThrResume( t.threadId )  END;*)
-			t := t.nextProcess
-		END;
-		
-		ResumeActivities;
-		
-	END TraceAll;
-	
-	
-
-	PROCEDURE SaveSP;   (* save current SP for usage by the GC *)
-	VAR me: Unix.Thread_t;  t: Process;
-	BEGIN
-		me := Unix.ThrThis(0);  t := root;
-		WHILE (t # NIL ) & (t.threadId # me) DO  t := t.nextProcess  END;
-		IF t # NIL THEN  t.SP := Machine.CurrentSP( )  END
-	END SaveSP;
-		
-	
 	PROCEDURE InvokeGC;
 	BEGIN
 		IF Machine.AcquireGC() THEN (* gets released by FinalizerCaller *)
@@ -770,6 +734,7 @@ TYPE
 	PROCEDURE Init;
 	BEGIN
 		TRACE("Init");
+		Unix.suspendHandler := GetContext;
 		(*
 		Unix.Dlsym( 0, "Unix.MtxInit",		ADDRESSOF( Unix.MtxInit ) );
 		Unix.Dlsym( 0, "Unix.MtxDestroy",	ADDRESSOF( Unix.MtxDestroy ) );

+ 4 - 3
source/Unix.BootConsole.Mod

@@ -24,7 +24,6 @@ TYPE
 VAR
 	appl: CommandThread;
 
-
 	PROCEDURE LoadModule( CONST name: Modules.Name );
 	VAR
 		m: Module;  res: LONGINT;  msg: ARRAY 256 OF CHAR;
@@ -35,8 +34,6 @@ VAR
 		END
 	END LoadModule;
 
-
-
 	PROCEDURE Command( CONST cmd: Modules.Name );
 	VAR
 		res: LONGINT;
@@ -169,9 +166,13 @@ VAR
 	BEGIN
 		IF ~TryCommand()  THEN
 			(* normal system start *)
+			LoadModule("Test");
+			
+			
 			LoadModule( "Clock" );
 			Execute( "XDisplay",  "Install" );
 			Execute( "KbdMouse",  "Init" );
+			Execute("Test", "Test");
 
 
 			Command( "WindowManager.Install" );