Selaa lähdekoodia

Console keeps running and traps in A2 work.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6944 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 vuotta sitten
vanhempi
commit
972f7e0c53
3 muutettua tiedostoa jossa 35 lisäystä ja 5 poistoa
  1. 1 0
      source/Generic.Unix.I386.Machine.Mod
  2. 19 2
      source/Generic.Unix.Objects.Mod
  3. 15 3
      source/Unix.StdIO.Mod

+ 1 - 0
source/Generic.Unix.I386.Machine.Mod

@@ -948,6 +948,7 @@ END GetTimer;
 		UNTIL i = 3;
 		logfile := Unix.open( ADDRESSOF( name ), Unix.rdwr + Unix.creat + Unix.trunc, Unix.rwrwr );
 		SilentLog;
+		VerboseLog;
 	END InitLog;
 	
 	PROCEDURE SilentLog*;

+ 19 - 2
source/Generic.Unix.Objects.Mod

@@ -39,6 +39,7 @@ CONST
 VAR
 	(* timer *)
 	timerActivity		: TimerActivity;
+	clock					: Clock;
 	timers				: Timer;  
 	timerListMutex	: Unix.Mutex_t;
 	
@@ -122,6 +123,14 @@ TYPE
 			END
 		END
 	END TimerActivity;
+	
+	Clock* = OBJECT
+	BEGIN{ACTIVE}
+		LOOP
+				Unix.ThrSleep( 10 ); 
+				timerActivity.UpdateTicks
+		END;
+	END Clock;
 
 
 
@@ -205,18 +214,19 @@ TYPE
 			
 			sp := context.r_sp; bp := context.r_bp; (*pc := context.r_pc;*)
 
+			(*
 			TRACE(context.r_si, context.r_di, context.r_bp, context.r_sp_x);
 			TRACE(context.r_bx, context.r_dx, context.r_cx, context.r_ax);
 			TRACE(context.r_pc, context.r_sp, context.fpc);
-			
 			TRACE(sp, bp, stackBottom);
+			*)
 
 			IF Heaps.GCType= Heaps.HeuristicStackInspectionGC THEN
 				Heaps.Candidate( context.r_di);  Heaps.Candidate( context.r_si );
 				Heaps.Candidate( context.r_bx ); Heaps.Candidate( context.r_dx);
 				Heaps.Candidate( context.r_cx ); Heaps.Candidate( context.r_ax);
 				IF (stackBottom # 0) & (sp # 0) & (sp <= stackBottom) THEN
-					TRACE(sp, stackBottom -sp);
+					(*TRACE(sp, stackBottom -sp);*)
 					Heaps.RegisterCandidates( sp, stackBottom - sp );
 				END;
 			ELSIF Heaps.GCType = Heaps.MetaDataForStackGC THEN
@@ -346,7 +356,9 @@ TYPE
 				cur.context.r_sp := Machine.CurrentSP();
 				cur.context.r_bp := Machine.CurrentBP();
 				cur.context.r_pc := ADDRESS OF GCLoop;
+				(*
 				TRACE(cur, cur.threadId, cur.context.r_sp, cur.context.r_bp, cur.context.r_pc);
+				*)
 				SuspendActivities;
 				
 				Heaps.CollectGarbage( Modules.root );
@@ -726,14 +738,18 @@ TYPE
 	VAR t: Process; bp: ADDRESS;
 	BEGIN
 		t := CurrentProcess();
+		(*
 		TRACE(t, t.threadId);
 		TRACE(Machine.CurrentBP(), ctxt.mc.r_bp);
+		*)
 		Unix.CopyContext(ctxt.mc, t.context);
+		(*
 		bp := Machine.CurrentBP(); 
 		TRACE(bp);
 		S.GET(bp+4, bp); 
 		TRACE(bp);
 		t.context.r_bp := bp;
+		*)
 	END GetContext;
 	
 	PROCEDURE SuspendActivities;
@@ -898,6 +914,7 @@ TYPE
 							
 		GetStacksize;  
 		Convert;
+		NEW(clock);
 		StartTimerActivity;
 		
 		NEW( finalizerCaller );

+ 15 - 3
source/Unix.StdIO.Mod

@@ -43,14 +43,26 @@ BEGIN
 END Args;
 
 PROCEDURE ReceiveStdin( VAR data: ARRAY OF CHAR;  ofs, size, min: LONGINT;  VAR len, res: LONGINT );
-VAR ures: LONGINT;
+VAR ures,i,err: LONGINT;
 BEGIN
 	len := 0;
 	REPEAT
 		ures := Unix.read( 0, ADDRESSOF( data[ofs] ), size );
 		IF ures > 0 THEN  INC( ofs, ures );  DEC( size, ures );  INC( len, ures )  END;
-	UNTIL (len >= min) OR ((ures <= 0) & (Unix.errno() # Unix.EINTR));
-	IF len > 0 THEN  res := Streams.Ok  ELSE  res := Streams.EOF  END
+		IF ures < 0 THEN err := Unix.errno() END;
+	UNTIL (len >= min) OR ((ures <= 0) & (err # Unix.EINTR) & (err # 0));
+	IF len >= min THEN  res := Streams.Ok  ELSE  res := Streams.EOF  END;
+	(*
+	TRACE(len, size, min, ures, Unix.errno(),err);
+	IF len < min THEN
+		Unix.Perror("receive: ")
+	END;
+	Trace.String("received: "); 
+	FOR i := ofs-len TO ofs-1 DO
+		Trace.Char(data[i]); 
+	END;
+	Trace.Ln;
+	*)
 END ReceiveStdin;
 
 PROCEDURE SendStdout( CONST data: ARRAY OF CHAR;  ofs, len: LONGINT;  prop: BOOLEAN;  VAR res: LONGINT );