Objects.SymU 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. MODULE Objects;
  2. IMPORT S := SYSTEM, Trace, Glue, Unix, Machine, Heaps, Modules;
  3. CONST
  4. PleaseHalt* = 10;
  5. Unbreakable* = 11;
  6. SelfTermination* = 12;
  7. Preempted* = 27;
  8. Resistant* = 28;
  9. MinPriority* = Unix.ThreadLow;
  10. Low* = (Unix.ThreadLow + 1);
  11. Normal* = Unix.ThreadNormal;
  12. High* = (Unix.ThreadHigh - 2);
  13. GCPriority* = (Unix.ThreadHigh - 1);
  14. Realtime* = Unix.ThreadHigh;
  15. Restart* = 0;
  16. Unknown* = 0;
  17. Ready* = 1;
  18. Running* = 2;
  19. AwaitingLock* = 3;
  20. AwaitingCond* = 4;
  21. AwaitingEvent* = 5;
  22. Terminated* = 6;
  23. Second* = 1000;
  24. DefaultStacksize = (128 * 1024);
  25. TYPE
  26. LockT = POINTER TO RECORD
  27. mtx, enter: ADDRESS;
  28. END;
  29. CpuCyclesArray* = ARRAY Machine.MaxCPU OF HUGEINT;
  30. ProtectedObject = POINTER TO RECORD
  31. END;
  32. ObjectHeader = Heaps.ProtRecBlock;
  33. ProcessQueue = Heaps.ProcessQueue;
  34. EventHandler* = PROCEDURE {DELEGATE};
  35. Timer* = OBJECT
  36. VAR
  37. next: Timer;
  38. trigger: LONGINT;
  39. handler: EventHandler;
  40. END Timer;
  41. TimerActivity = OBJECT {EXCLUSIVE}
  42. VAR
  43. t, r: Timer;
  44. h: EventHandler;
  45. restart: BOOLEAN;
  46. PROCEDURE ^ UpdateTicks;
  47. PROCEDURE ^ Restart;
  48. BEGIN{ACTIVE, SAFE, PRIORITY(High)}
  49. END TimerActivity;
  50. Clock* = OBJECT {EXCLUSIVE}
  51. BEGIN{ACTIVE}
  52. END Clock;
  53. FinalizedCollection* = OBJECT
  54. PROCEDURE ^ RemoveAll*(obj: ANY);
  55. END FinalizedCollection;
  56. FinalizerNode* = POINTER TO RECORD (Heaps.FinalizerNode)
  57. c*: FinalizedCollection;
  58. END;
  59. FinalizerCaller = OBJECT {EXCLUSIVE}
  60. VAR
  61. n: Heaps.FinalizerNode;
  62. start: BOOLEAN;
  63. PROCEDURE ^ Activate;
  64. BEGIN{ACTIVE, SAFE, PRIORITY(High)}
  65. END FinalizerCaller;
  66. Body = PROCEDURE (self: ProtectedObject);
  67. Condition = PROCEDURE (slink: ADDRESS):BOOLEAN;
  68. Process* = OBJECT (Heaps.ProcessLink)
  69. VAR
  70. threadId-: Unix.Thread_t;
  71. nextProcess-: Process;
  72. stackBottom-: ADDRESS;
  73. id-: LONGINT;
  74. body: Body;
  75. mode-: LONGINT;
  76. flags-: SET;
  77. priority-: LONGINT;
  78. succ: Process;
  79. obj-: ProtectedObject;
  80. condition-: Condition;
  81. condFP-: ADDRESS;
  82. continue: Unix.Condition_t;
  83. waitingOn-: ProtectedObject;
  84. procID-: LONGINT;
  85. state-: Machine.State;
  86. state0: ARRAY 2048 OF CHAR;
  87. context: ANY;
  88. PROCEDURE ^ FindRoots*;
  89. PROCEDURE ^ Cancel;
  90. PROCEDURE ^ GetPriority(): LONGINT;
  91. PROCEDURE ^ SetPriority(prio: LONGINT);
  92. PROCEDURE ^ & Initialize(obj: ProtectedObject; bodyProc: Body; prio: LONGINT; fl: SET; stacksize: LONGINT);
  93. END Process;
  94. GCStatusExt = OBJECT (Heaps.GCStatus)
  95. PROCEDURE ^ SetgcOngoing*(value: BOOLEAN);
  96. END GCStatusExt;
  97. MainThread = OBJECT {EXCLUSIVE}
  98. VAR
  99. exit: BOOLEAN;
  100. PROCEDURE ^ & Init;
  101. PROCEDURE ^ Await;
  102. END MainThread;
  103. VAR
  104. timerActivity: TimerActivity;
  105. clock: Clock;
  106. timers: Timer;
  107. timerListMutex: Unix.Mutex_t;
  108. timerStopped: BOOLEAN;
  109. root-: Process;
  110. stacksize: LONGINT;
  111. processList: Unix.Mutex_t;
  112. createProcess: Unix.Mutex_t;
  113. startProcess: Unix.Mutex_t;
  114. startEventLock: Unix.Mutex_t;
  115. lockMutex: Unix.Mutex_t;
  116. childrunning: Unix.Condition_t;
  117. processPointer: Unix.Key_t;
  118. newProcess: Process;
  119. nextPID: LONGINT;
  120. finalizerCaller: FinalizerCaller;
  121. mainthread: Unix.Thread_t;
  122. main: MainThread;
  123. TraceProcessHook*: PROCEDURE (prcoess: Process; pc, bp: ADDRESS; stacklow, stackhigh: ADDRESS);
  124. PROCEDURE ^ BodyStarter;
  125. PROCEDURE ^ InitProtHeader(hdr{UNTRACED} : ObjectHeader);
  126. PROCEDURE ^ CreateProcess*(body: Body; priority: LONGINT; flags: SET; obj: ProtectedObject);
  127. PROCEDURE ^ Lock*(obj: ProtectedObject; exclusive: BOOLEAN);
  128. PROCEDURE ^ Await*(cond: Condition; slink: ADDRESS; obj: ProtectedObject; flags: SET);
  129. PROCEDURE ^ Unlock*(obj: ProtectedObject; dummy: BOOLEAN);
  130. PROCEDURE ^ FindCondition(VAR q: ProcessQueue): Process;
  131. PROCEDURE ^ Get(VAR queue: ProcessQueue; VAR new: Process);
  132. PROCEDURE ^ Put(VAR queue: ProcessQueue; t: Process);
  133. PROCEDURE ^ Terminate*;
  134. PROCEDURE ^ TerminateThis*(p: Process; unbreakable: BOOLEAN);
  135. PROCEDURE ^ SetPriority*(pri: LONGINT);
  136. PROCEDURE ^ Sleep*(ms: LONGINT);
  137. PROCEDURE ^ Yield*;
  138. PROCEDURE ^ CurrentProcess*(): Process;
  139. PROCEDURE ^ CurrentContext*(): ANY;
  140. PROCEDURE ^ SetContext*(context: ANY);
  141. PROCEDURE ^ ActiveObject*(): ANY;
  142. PROCEDURE ^ GetStackBottom*(p: Process): ADDRESS;
  143. PROCEDURE ^ GetProcessID*(): LONGINT;
  144. PROCEDURE ^ GetCpuCycles*(process: Process; VAR cpuCycles: CpuCyclesArray; all: BOOLEAN);
  145. PROCEDURE ^ RegisterFinalizer(obj: ANY; fin: Heaps.Finalizer);
  146. PROCEDURE ^ FinalizeActiveObj(obj: ANY);
  147. PROCEDURE ^ FinalizeProtObject(obj: ANY);
  148. PROCEDURE ^ FinalizeProcess(obj: ANY);
  149. PROCEDURE ^ Exit;
  150. PROCEDURE ^ ExitTrap*;
  151. PROCEDURE ^ Remove(t: Timer);
  152. PROCEDURE ^ Insert(t: Timer);
  153. PROCEDURE ^ SetTimeout*(t: Timer; h: EventHandler; ms: LONGINT);
  154. PROCEDURE ^ SetTimeoutAt*(t: Timer; h: EventHandler; ms: LONGINT);
  155. PROCEDURE ^ CancelTimeout*(t: Timer);
  156. PROCEDURE ^ GetContext(ctxt: Unix.Ucontext);
  157. PROCEDURE ^ UpdateProcessState*(p: Process);
  158. PROCEDURE ^ SuspendActivities;
  159. PROCEDURE ^ ResumeActivities;
  160. PROCEDURE ^ GCLoop*;
  161. PROCEDURE ^ CurrentProcessTime*(): HUGEINT;
  162. PROCEDURE ^ TimerFrequency*(): HUGEINT;
  163. PROCEDURE ^ LeaveA2-;
  164. PROCEDURE ^ ReenterA2-;
  165. PROCEDURE ^ StartTimerActivity;
  166. PROCEDURE ^ GetStacksize;
  167. PROCEDURE ^ Convert;
  168. PROCEDURE ^ Init;
  169. PROCEDURE ^ MainThreadSleep;
  170. PROCEDURE ^ {FINAL} Final;
  171. PROCEDURE ^ GCStatusFactory(): Heaps.GCStatus;
  172. BEGIN
  173. END Objects.