Browse Source

Fixed scheduling of sleeping threads after shutting down

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8389 8c9fc860-2736-0410-a75d-ab315db34111
negelef 6 years ago
parent
commit
cceaf811e7
1 changed files with 7 additions and 1 deletions
  1. 7 1
      source/Unix.Environment.Mod

+ 7 - 1
source/Unix.Environment.Mod

@@ -50,7 +50,7 @@ VAR nextActivity: Activities.Activity;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
 	INC (milliseconds, Clock ());
 	Counters.Inc (Activities.awaiting);
-	WHILE Clock () - milliseconds < 0 DO
+	WHILE (status = Running) & (Clock () - milliseconds < 0) DO
 		IF Activities.Select (nextActivity, Activities.IdlePriority) THEN
 			Activities.SwitchTo (nextActivity, Enqueue, NIL);
 			Activities.FinalizeSwitch;
@@ -63,6 +63,9 @@ PROCEDURE Enqueue (previous {UNTRACED}: Activities.Activity; argument: ADDRESS);
 VAR item: Queues.Item;
 BEGIN {UNCOOPERATIVE, UNCHECKED}
 	Queues.Enqueue (previous, sleepingQueue);
+	IF status # Running THEN
+		WHILE Queues.Dequeue (item, sleepingQueue) DO Activities.Resume (item(Activities.Activity)) END;
+	END;
 END Enqueue;
 
 PROCEDURE TimerThread;
@@ -80,6 +83,9 @@ BEGIN
 			Activities.Resume (item(Activities.Activity));
 		END;
 	END;
+	WHILE Queues.Dequeue (item, sleepingQueue) DO
+		Activities.Resume (item(Activities.Activity));
+	END;
 END TickLoop;
 
 PROCEDURE Allocate- (size: SIZE): ADDRESS;