LLCounter.Mod 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. (** Simple test module for low-level locks *)
  2. MODULE LLCounter;
  3. IMPORT SYSTEM, Machine, Objects, Trace;
  4. CONST
  5. Count = 4000000;
  6. TYPE
  7. Writer = OBJECT
  8. VAR
  9. c: LONGINT;
  10. BEGIN {ACTIVE}
  11. FOR c := 1 TO Count DO
  12. Increment
  13. END;
  14. Lock;
  15. Trace.String("Writer "); Trace.Address(SYSTEM.VAL(ADDRESS, SELF)); Trace.String(" finished. i = "); Trace.Int(i, 0);
  16. Trace.String(". c = "); Trace.Int(c, 0); Trace.Ln;
  17. Unlock
  18. END Writer;
  19. Reader = OBJECT
  20. BEGIN {ACTIVE}
  21. LOOP Read END
  22. END Reader;
  23. Printer = OBJECT
  24. VAR
  25. id, count: LONGINT;
  26. PROCEDURE & Init(i: LONGINT);
  27. BEGIN
  28. id := i
  29. END Init;
  30. PROCEDURE Print;
  31. BEGIN
  32. Lock;
  33. Trace.String("Printer: Inside a critical section. id = "); Trace.Int(id, 0); Trace.Ln;
  34. Unlock
  35. END Print;
  36. BEGIN {ACTIVE}
  37. (*FOR count := 0 TO 1000 DO*)
  38. LOOP
  39. Print
  40. END
  41. END Printer;
  42. IndependentWriter = OBJECT
  43. VAR
  44. i, c, id: LONGINT;
  45. lock: BOOLEAN;
  46. padding: ARRAY 30 OF CHAR;
  47. PROCEDURE & Init(id: LONGINT);
  48. BEGIN
  49. SELF.id := id
  50. END Init;
  51. BEGIN {ACTIVE}
  52. (*LOOP*)
  53. (*FOR c := 1 TO Count DO*)
  54. WHILE i < Count DO
  55. (*Lock;*)
  56. (*Machine.AcquireSpin(lock);*)
  57. INC(i);
  58. (*Machine.ReleaseSpin(lock)*)
  59. (*Unlock*)
  60. Test(ADDRESSOF(Bad), 0);
  61. Test(ADDRESSOF(Bad), 0)
  62. END;
  63. (*Lock;*)
  64. Trace.Int(id, 0); Trace.String(". i = "); Trace.Int(i, 0); Trace.Ln;
  65. (*Unlock*)
  66. END IndependentWriter;
  67. IndependentWriter2 = OBJECT
  68. VAR
  69. i, c, id, d: LONGINT;
  70. lock: BOOLEAN;
  71. padding: ARRAY 30 OF CHAR;
  72. PROCEDURE & Init(id: LONGINT);
  73. BEGIN
  74. SELF.id := id
  75. END Init;
  76. BEGIN {ACTIVE}
  77. FOR c := 1 TO Count DIV 10 DO
  78. FOR d := 1 TO 10 DO
  79. Lock;
  80. (*Machine.AcquireSpin(lock);*)
  81. INC(i);
  82. (*Machine.ReleaseSpin(lock)*)
  83. Unlock
  84. END;
  85. Objects.Yield
  86. END;
  87. (*Lock;*)
  88. Trace.Int(id, 0); Trace.String(". i = "); Trace.Int(i, 0); Trace.Ln;
  89. (*Unlock*)
  90. END IndependentWriter2;
  91. Buffer = ARRAY 1024 * 1024 OF CHAR;
  92. VAR
  93. i: LONGINT;
  94. lock: RECORD
  95. padding: ARRAY 31 OF CHAR;
  96. lock: BOOLEAN;
  97. END;
  98. w1, w2, w3, w4: Writer;
  99. r: Reader;
  100. p1, p2, p3, p4: Printer;
  101. iw1, iw2: IndependentWriter;
  102. iw21, iw22: IndependentWriter2;
  103. PROCEDURE Lock;
  104. BEGIN
  105. Machine.DisableInterrupts;
  106. (*Machine.AcquireSpin(lock.lock);*)
  107. (*Machine.Acquire(Machine.KernelLog)*)
  108. END Lock;
  109. PROCEDURE Unlock;
  110. BEGIN
  111. (*Machine.Release(Machine.KernelLog);*)
  112. (*Machine.ReleaseSpin(lock.lock);*)
  113. Machine.EnableInterrupts
  114. END Unlock;
  115. PROCEDURE Test(a, b: ADDRESS);
  116. BEGIN
  117. Test2(a, b)
  118. END Test;
  119. PROCEDURE Test2(a, b: ADDRESS);
  120. END Test2;
  121. PROCEDURE Bad;
  122. VAR
  123. bp, sp: ADDRESS;
  124. BEGIN
  125. Machine.DisableInterrupts;
  126. Trace.StringLn("BAD BOY");
  127. LOOP END
  128. END Bad;
  129. PROCEDURE Increment;
  130. VAR j: LONGINT;
  131. BEGIN
  132. Lock;
  133. INC(i);
  134. Unlock
  135. (*; FOR j := 0 TO 10000 DO END*)
  136. END Increment;
  137. PROCEDURE Read;
  138. BEGIN
  139. Lock;
  140. Trace.String("i: "); Trace.Int(i, 0); Trace.Ln;
  141. Unlock
  142. END Read;
  143. BEGIN
  144. Trace.StringLn("=== Begin Test ===");
  145. NEW(w1);
  146. NEW(w2);
  147. (*NEW(w3);
  148. NEW(w4);
  149. NEW(w1);
  150. NEW(w2);
  151. NEW(w3);
  152. NEW(w4);*)
  153. (*NEW(r);*)
  154. (*NEW(p1, 1);
  155. NEW(p2, 2);
  156. NEW(p3, 3);
  157. NEW(p4, 4);*)
  158. (*NEW(iw1, 1);
  159. NEW(iw2, 2)*)
  160. (*NEW(iw21, 1);
  161. NEW(iw22, 2)*)
  162. END LLCounter.