ProcessInfo.Mod 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. MODULE ProcessInfo; (** AUTHOR "staubesv"; PURPOSE "Information about processes"; *)
  2. IMPORT
  3. SYSTEM, Streams, Reflection, Modules, Objects, ProcessInfo0;
  4. CONST
  5. MaxNofProcesses* = 1000;
  6. TYPE
  7. ProcessArray* = ProcessInfo0.ProcessArray;
  8. IsGreaterThanProc* = PROCEDURE {DELEGATE} (p1, p2 : Objects.Process) : BOOLEAN; (* { p1, p2 # NIL } *)
  9. PROCEDURE Clear*(VAR array : ProcessArray);
  10. VAR i : LONGINT;
  11. BEGIN
  12. FOR i := 0 TO LEN(array)-1 DO array[i] := NIL; END;
  13. END Clear;
  14. PROCEDURE Copy*(CONST from : ProcessArray; VAR to : ProcessArray);
  15. VAR length, fromLength, toLength, i : LONGINT;
  16. BEGIN
  17. fromLength := LEN(from);
  18. toLength := LEN(to);
  19. IF (fromLength <= toLength) THEN length := fromLength; ELSE length := toLength; END;
  20. FOR i := 0 TO length - 1 DO
  21. to[i] := from[i];
  22. END;
  23. FOR i := length - 1 TO toLength - 1 DO
  24. to[i] := NIL;
  25. END;
  26. END Copy;
  27. PROCEDURE Sort*(VAR processes : ProcessArray; nofProcesses : LONGINT; isGreaterThan : IsGreaterThanProc);
  28. VAR i, j : LONGINT; temp : Objects.Process;
  29. BEGIN
  30. ASSERT(isGreaterThan # NIL);
  31. (* bubble sort, descending *)
  32. FOR i := 0 TO nofProcesses - 1 DO
  33. FOR j := 0 TO nofProcesses - 2 DO
  34. IF isGreaterThan(processes[j + 1], processes[j]) THEN
  35. temp := processes[j];
  36. processes[j] := processes[j + 1];
  37. processes[j + 1] := temp;
  38. END;
  39. END;
  40. END;
  41. END Sort;
  42. PROCEDURE Find*(CONST processes : ProcessArray; id : LONGINT) : Objects.Process;
  43. VAR process : Objects.Process; i : LONGINT;
  44. BEGIN
  45. i := 0;
  46. WHILE (i < LEN(processes)-1) & (processes[i] # NIL) & (processes[i].id # id) DO INC(i); END;
  47. IF (i < LEN(processes)) THEN
  48. process := processes[i];
  49. ELSE
  50. process := NIL;
  51. END;
  52. RETURN process;
  53. END Find;
  54. PROCEDURE SortByID*(p1, p2 : Objects.Process) : BOOLEAN;
  55. BEGIN
  56. ASSERT((p1 # NIL) & (p2 # NIL));
  57. RETURN p1.id > p2.id;
  58. END SortByID;
  59. PROCEDURE SortByPriority*(p1, p2 : Objects.Process) : BOOLEAN;
  60. BEGIN
  61. ASSERT((p1 # NIL) & (p2 # NIL));
  62. RETURN p1.priority > p2.priority;
  63. END SortByPriority;
  64. PROCEDURE SortByMode*(p1, p2 : Objects.Process) : BOOLEAN;
  65. BEGIN
  66. ASSERT((p1 # NIL) & (p2 # NIL));
  67. RETURN p1.mode > p2.mode;
  68. END SortByMode;
  69. PROCEDURE GetProcesses*(VAR processes : ProcessArray; VAR nofProcesses : LONGINT);
  70. BEGIN
  71. ProcessInfo0.GetProcesses(processes, nofProcesses);
  72. END GetProcesses;
  73. PROCEDURE GetProcess*(pid : LONGINT) : Objects.Process;
  74. BEGIN
  75. RETURN ProcessInfo0.GetProcess(pid);
  76. END GetProcess;
  77. PROCEDURE WriteMode*(mode : LONGINT; out : Streams.Writer);
  78. BEGIN
  79. CASE mode OF
  80. |Objects.Ready : out.String("rdy");
  81. |Objects.Running : out.String("run");
  82. |Objects.AwaitingLock : out.String("awl");
  83. |Objects.AwaitingCond : out.String("awc");
  84. |Objects.AwaitingEvent : out.String("awe");
  85. |Objects.Terminated : out.String("rip");
  86. ELSE
  87. out.String("???");
  88. END;
  89. out.Update;
  90. END WriteMode;
  91. PROCEDURE WriteActiveObject*(t : Objects.Process; out : Streams.Writer);
  92. VAR adr : LONGINT;
  93. BEGIN
  94. IF t.obj # NIL THEN
  95. SYSTEM.GET(SYSTEM.VAL(LONGINT, t.obj)-4, adr);
  96. Reflection.WriteType(out, adr);
  97. END;
  98. END WriteActiveObject;
  99. PROCEDURE WriteWaitingOn*(t : Objects.Process; out : Streams.Writer);
  100. VAR adr : LONGINT; mod : Modules.Module;
  101. BEGIN
  102. IF t.mode = Objects.AwaitingLock THEN
  103. adr := SYSTEM.VAL(LONGINT, t.waitingOn);
  104. IF adr # 0 THEN (* can be 0 when snapshot is taken *)
  105. SYSTEM.GET(adr-4, adr); DEC(adr, adr MOD 8);
  106. IF adr = SYSTEM.TYPECODE(Modules.Module) THEN
  107. mod := SYSTEM.VAL(Modules.Module, adr);
  108. out.String(mod.name);
  109. ELSE
  110. Reflection.WriteType(out, adr);
  111. END;
  112. END
  113. ELSIF t.mode = Objects.AwaitingCond THEN
  114. Reflection.WriteProc(out, SYSTEM.VAL(LONGINT, t.condition));
  115. END;
  116. out.Update;
  117. END WriteWaitingOn;
  118. PROCEDURE WriteFlags*(flags : SET; out : Streams.Writer);
  119. VAR comma : BOOLEAN;
  120. BEGIN
  121. comma := FALSE;
  122. IF Objects.Restart IN flags THEN
  123. out.String("restart"); comma := TRUE;
  124. END;
  125. IF Objects.Resistant IN flags THEN
  126. IF comma THEN out.String(", "); END;
  127. out.String("resistant"); comma := TRUE;
  128. END;
  129. IF Objects.Preempted IN flags THEN
  130. IF comma THEN out.String(", "); END;
  131. out.String("preempted"); comma := TRUE;
  132. END;
  133. IF Objects.PleaseHalt IN flags THEN
  134. IF comma THEN out.String(", "); END;
  135. out.String("pleaseHalt"); comma := TRUE;
  136. END;
  137. IF Objects.Unbreakable IN flags THEN
  138. IF comma THEN out.String(", "); END;
  139. out.String("unbreakable"); comma := TRUE;
  140. END;
  141. IF Objects.SelfTermination IN flags THEN
  142. IF comma THEN out.String(", "); END;
  143. out.String("selftermination");
  144. END;
  145. out.Update;
  146. END WriteFlags;
  147. PROCEDURE ShowStack*(p : Objects.Process; out : Streams.Writer);
  148. BEGIN
  149. ASSERT((p # NIL) & (out # NIL));
  150. out.String("Active Object: "); WriteActiveObject(p, out); out.Ln;
  151. out.String("Current Procedure: ");
  152. Reflection.WriteProc(out, p.state.PC); out.Ln;
  153. (* mode *)
  154. out.String("Mode: "); WriteMode(p.mode, out); out.Ln;
  155. out.String("Waiting On: "); WriteWaitingOn(p, out); out.Ln;
  156. (* Flags *)
  157. out.String("Flags: "); WriteFlags(p.flags, out); out.Ln;
  158. out.String("Stack Trace Back:"); out.Ln; out.Update;
  159. Reflection.StackTraceBack(out, p.state.PC, p.state.BP, p.state.SP, Objects.GetStackBottom(p), TRUE, FALSE);
  160. out.Ln; out.Update;
  161. END ShowStack;
  162. PROCEDURE ShowProcess*(p : Objects.Process; out : Streams.Writer);
  163. BEGIN
  164. ASSERT((p # NIL) & (out # NIL));
  165. IF (p.mode # Objects.Terminated) THEN
  166. out.Int(p.id, 5); out.String(" ");
  167. WriteMode(p.mode, out); out.String(" ");
  168. WriteActiveObject(p, out);
  169. out.Ln; out.Update;
  170. END;
  171. END ShowProcess;
  172. END ProcessInfo.
  173. ProcessInfo.ShowProcesses ~
  174. ProcessInfo.ShowStacks ~
  175. SystemTools.Free ProcessInfo ProcessInfo0 ~