Advertisement
kish-dev

bw_bakery

May 3rd, 2022 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. /*
  2. me [] f1
  3. #define f1 (mult == 31 || mult == 1)
  4.  
  5. ffs [] ((c0 -> <>proc0) && (c1 -> <> proc1))
  6.  
  7. #define c0 (choosing[0] == true)
  8. #define proc0 (proc[0]@crit)
  9. #define c1 (choosing[1] == true)
  10. #define proc1 (proc[1]@crit)
  11.  
  12.  
  13. freedom for blocking
  14. ffb [] []((c0 && c1 && !c2) -> <>(proc0 || proc1)) && []((c0 && c2 && !c1) -> <>(proc0 || proc2)) && []((c1 && c2 && !c0) -> <>(proc1 || proc2)) && []((c0 && c1 && c2) -> <>(proc0 || proc1 || proc2))
  15.  
  16. #define c0 (choosing[0] == true)
  17. #define proc0 (proc[0]@crit)
  18. #define c1 (choosing[1] == true)
  19. #define proc1 (proc[1]@crit)
  20. #define c2 (choosing[2] == true)
  21. #define proc2 (proc[2]@crit)
  22.  
  23. */
  24.  
  25. #define n_proc 3 /* Число конкурирующих процессов */
  26. #define n 3 /* Число для индексации массива */
  27.  
  28. mtype = { black, white };
  29.  
  30. bool choosing[n] = false;
  31. mtype color[n] = black;
  32. int TURN[n] = 0;
  33. mtype cur_color = black;
  34. int mult = 1;
  35.  
  36. inline max(i, j, max_number) {
  37.  
  38. j = 0;
  39. max_number = 0;
  40. do
  41. ::j < n_proc ->
  42. if
  43. ::color[j] == color[i] ->
  44. if
  45. ::TURN[j] > max_number ->
  46. max_number = TURN[j];
  47. ::else -> skip;
  48. fi;
  49. ::else -> skip;
  50. fi;
  51. j = j + 1;
  52. :: else -> break;
  53. od;
  54.  
  55. }
  56.  
  57. inline unlock(i) {
  58. if
  59. ::color[i] == black ->
  60. cur_color = white;
  61. ::else ->
  62. cur_color = black;
  63. fi;
  64. TURN[i] = 0;
  65. }
  66.  
  67. inline lock(i, j, max_number, pointer_j) {
  68.  
  69. j = 0;
  70. choosing[i] = true;
  71. color[i] = cur_color;
  72.  
  73. max(i, pointer_j, max_number);
  74. TURN[i] = 1 + max_number;
  75. choosing[i] = false;
  76. do
  77. ::j < n ->
  78. if
  79. :: j != i ->
  80.  
  81. (choosing[j] == false);
  82. if
  83. ::color[i] == color[j] ->
  84.  
  85.  
  86. ((TURN[j] == 0) || ((TURN[j] > TURN[i]) || (TURN[j] == TURN[i] && j > i)) || (color[j] != color[i]));
  87.  
  88.  
  89. ::else ->
  90.  
  91. (TURN[j] == 0 || (color[i] != cur_color) || color[j] == color[i]);
  92. fi;
  93.  
  94. ::else -> skip;
  95. fi;
  96.  
  97.  
  98. j = j + 1;
  99. ::else -> break;
  100. od;
  101.  
  102. }
  103.  
  104. active[n] proctype proc() {
  105.  
  106. int j = 0;
  107. int max_number = 0;
  108. int pointer_j = 0;
  109. again: lock(_pid, j, max_number, pointer_j);
  110.  
  111. crit: { mult = mult * 31;
  112. assert(mult == 31);
  113. mult = mult / 31;
  114. };
  115. unlock(_pid);
  116. goto again;
  117.  
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement