ProcessInfo0.Mod 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. MODULE ProcessInfo0; (** AUTHOR "staubesv"; PURPOSE "Platform-dependent process interface"; *)
  2. IMPORT
  3. SYSTEM, Machine, Heaps, Objects;
  4. TYPE
  5. ProcessArray* = ARRAY OF Objects.Process;
  6. PROCEDURE GetProcesses*(VAR array : ProcessArray; VAR nofProcesses : LONGINT);
  7. VAR
  8. memBlock {UNTRACED}: Machine.MemoryBlock;
  9. heapBlock {UNTRACED}: Heaps.HeapBlock;
  10. process: Objects.Process;
  11. (* otherwise dead process can be traced after leaving the saved block
  12. Lazy-Sweep might become active
  13. *)
  14. blockAdr, tag : ADDRESS;
  15. length, i : LONGINT;
  16. BEGIN
  17. length := LEN(array); nofProcesses := 0;
  18. FOR i := 0 TO i-1 DO array[i] := NIL; END;
  19. Machine.Acquire(Machine.Heaps);
  20. Heaps.FullSweep; (* this is strictly required because when the sweep phase has not yet finished, heap blocks might be free *)
  21. memBlock := Machine.memBlockHead;
  22. WHILE (memBlock # NIL) DO
  23. blockAdr := memBlock.beginBlockAdr;
  24. WHILE (blockAdr # memBlock.endBlockAdr) DO
  25. heapBlock := SYSTEM.VAL(Heaps.HeapBlock, blockAdr + Heaps.BlockHeaderSize);
  26. IF (heapBlock IS Heaps.RecordBlock) THEN
  27. SYSTEM.GET(heapBlock.dataAdr + Heaps.TypeDescOffset, tag);
  28. IF (nofProcesses < length) & (tag = SYSTEM.TYPECODE(Objects.Process)) THEN
  29. process := SYSTEM.VAL(Objects.Process, heapBlock.dataAdr);
  30. IF (process.mode # Objects.Terminated) THEN
  31. array[nofProcesses] := process;
  32. INC(nofProcesses);
  33. END;
  34. END;
  35. END;
  36. blockAdr := blockAdr + heapBlock.size
  37. END;
  38. memBlock := memBlock.next
  39. END;
  40. (* now processes cannot be collected because they are references by the process array *)
  41. Machine.Release(Machine.Heaps);
  42. END GetProcesses;
  43. PROCEDURE GetProcess*(id : LONGINT) : Objects.Process;
  44. VAR
  45. memBlock {UNTRACED}: Machine.MemoryBlock;
  46. heapBlock {UNTRACED}: Heaps.HeapBlock;
  47. blockAdr, tag : ADDRESS;
  48. process : Objects.Process;
  49. i : LONGINT;
  50. BEGIN
  51. i := 0;
  52. process := NIL;
  53. Machine.Acquire(Machine.Heaps);
  54. Heaps.FullSweep; (* this is strictly required because when the sweep phase has not yet finished, heap blocks might be free *)
  55. memBlock := Machine.memBlockHead;
  56. WHILE (memBlock # NIL) & (process = NIL) DO
  57. blockAdr := memBlock.beginBlockAdr;
  58. WHILE (blockAdr # memBlock.endBlockAdr) & (process = NIL) DO
  59. heapBlock := SYSTEM.VAL(Heaps.HeapBlock, blockAdr + Heaps.BlockHeaderSize);
  60. IF (heapBlock IS Heaps.RecordBlock) THEN
  61. SYSTEM.GET(heapBlock.dataAdr + Heaps.TypeDescOffset, tag);
  62. IF (tag = SYSTEM.TYPECODE(Objects.Process)) THEN
  63. process := SYSTEM.VAL(Objects.Process, heapBlock.dataAdr);
  64. IF (process.id # id) THEN process := NIL; END;
  65. END;
  66. END;
  67. blockAdr := blockAdr + heapBlock.size
  68. END;
  69. memBlock := memBlock.next
  70. END;
  71. Machine.Release(Machine.Heaps);
  72. RETURN process;
  73. END GetProcess;
  74. END ProcessInfo0.
  75. FoxGenericObjectFile.Show Heaps.GofW ~
  76. FoxGenericObjectFile.Show ProcessInfo0.GofW ~