浏览代码

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 年之前
父节点
当前提交
cceaf811e7
共有 1 个文件被更改,包括 7 次插入1 次删除
  1. 7 1
      source/Unix.Environment.Mod

+ 7 - 1
source/Unix.Environment.Mod

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