2
0

Unix.Environment.Mod 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. (* Runtime environment for Unix *)
  2. (* Copyright (C) Florian Negele *)
  3. MODULE Environment;
  4. IMPORT SYSTEM, Activities, Counters, Unix, Processors, Queues, Timer, Trace;
  5. CONST IsNative* = FALSE;
  6. CONST Running* = 0; ShuttingDown* = 1; Rebooting* = 2;
  7. VAR status* := 0: WORD;
  8. VAR clock: Timer.Counter;
  9. VAR milliseconds: Timer.Counter;
  10. VAR sleepingQueue: Queues.Queue;
  11. PROCEDURE {NORETURN} Abort-;
  12. BEGIN {UNCOOPERATIVE, UNCHECKED}
  13. IF Activities.GetCurrentActivity () # NIL THEN Activities.TerminateCurrentActivity END;
  14. Exit (1);
  15. END Abort;
  16. PROCEDURE Shutdown*;
  17. BEGIN {UNCOOPERATIVE, UNCHECKED}
  18. Trace.StringLn ("system: shutting down...");
  19. Trace.StringLn ("system: shutting down...");
  20. END Shutdown;
  21. PROCEDURE Reboot*;
  22. BEGIN {UNCOOPERATIVE, UNCHECKED}
  23. Shutdown;
  24. ASSERT (CAS (status, ShuttingDown, Rebooting) = ShuttingDown);
  25. END Reboot;
  26. PROCEDURE {NORETURN} Exit- (status: WORD);
  27. BEGIN {UNCOOPERATIVE, UNCHECKED}
  28. Unix.exit (status);
  29. END Exit;
  30. PROCEDURE Clock- (): LONGINT;
  31. BEGIN {UNCOOPERATIVE, UNCHECKED}
  32. RETURN LONGINT ((Timer.GetCounter () - clock) / milliseconds);
  33. END Clock;
  34. PROCEDURE Sleep- (milliseconds: LONGINT);
  35. VAR nextActivity: Activities.Activity;
  36. BEGIN {UNCOOPERATIVE, UNCHECKED}
  37. INC (milliseconds, Clock ());
  38. Counters.Inc (Activities.awaiting);
  39. WHILE Clock () - milliseconds < 0 DO
  40. IF Activities.Select (nextActivity, Activities.IdlePriority) THEN
  41. Activities.SwitchTo (nextActivity, Enqueue, NIL);
  42. Activities.FinalizeSwitch;
  43. END;
  44. END;
  45. Counters.Dec (Activities.awaiting);
  46. END Sleep;
  47. PROCEDURE Enqueue (previous {UNTRACED}: Activities.Activity; argument: ADDRESS);
  48. VAR item: Queues.Item;
  49. BEGIN {UNCOOPERATIVE, UNCHECKED}
  50. Queues.Enqueue (previous, sleepingQueue);
  51. END Enqueue;
  52. PROCEDURE GetInit- (n: SIZE; VAR val: LONGINT);
  53. BEGIN val := 0;
  54. END GetInit;
  55. PROCEDURE Initialize-;
  56. BEGIN {UNCOOPERATIVE, UNCHECKED}
  57. clock := Timer.GetCounter ();
  58. milliseconds := Timer.GetFrequency () DIV 1000;
  59. END Initialize;
  60. PROCEDURE Terminate-;
  61. BEGIN {UNCOOPERATIVE, UNCHECKED}
  62. END Terminate;
  63. END Environment.