Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. 1 #define NPROCS 6
  2. 2
  3. 3 typedef Semaphore {
  4. 4 byte count;
  5. 5 byte i;
  6. 6 byte temp;
  7. 7 chan ch = [NPROCS] of {pid};
  8. 8 }
  9. 9
  10. 10 inline initSem(S, n) {S.count = n;
  11. 11 S.i = 0;}
  12. 12
  13. 13 inline wait (S) {
  14. 14 atomic {
  15. 15 if :: S.count >= 1 -> S.count--;
  16. 16 ::else ->
  17. 17 S.ch ! _pid;
  18. 18 !(S.ch ?? [eval(_pid)])
  19. 19 fi;
  20. 20 }
  21. 21 }
  22. 22
  23. 23 inline signal (S) {
  24. 24 atomic {
  25. 25 S.i = len(S.ch);
  26. 26 if :: S.i == 0 -> S.count++
  27. 27 ::else ->
  28. 28 do :: S.i == 1 -> S.ch ? _; break
  29. 29 ::else ->
  30. 30 S.i--;
  31. 31 S.ch ? S.temp;
  32. 32 if
  33. 33 :: break
  34. 34 ::S.ch ! S.temp;
  35. 35 fi
  36. 36 od
  37. 37 fi
  38. 38 }
  39. 39 }
  40. 40
  41. 41 Semaphore mutex;
  42. 42 Semaphore db;
  43. 43 int reader_count;
  44. 44
  45. 45 proctype reader (){
  46. 46 do
  47. 47 ::true->
  48. 48 wait(mutex);
  49. 49 reader_count++;
  50. 50 if :: (reader_count == 1) -> wait(db);
  51. 51 fi;
  52. 52 signal(mutex);
  53. 53 /* read */
  54. 54 wait (mutex);
  55. 55 reader_count = reader_count - 1;
  56. 56 if :: (reader_count == 0) ->
  57. 57 signal(db);
  58. 58 fi;
  59. 59
  60. 60 signal(mutex);
  61. 61 od;
  62. 62 }
  63. 63
  64. 64 proctype writer () {
  65. 65 do
  66. 66 ::true ->
  67. 67 /* create */
  68. 68 wait (db);
  69. 69 /* write */
  70. 70 signal (db);
  71. 71 od;
  72. 72 }
  73. 73
  74. 74 init {
  75. 75 atomic {
  76. 76 initSem (mutex, 3);
  77. 77 initSem (db,3);
  78. 78 int j;
  79. 79 for (j :1..3){
  80. 80 run writer ();
  81. 81 run reader ();
  82. 82 }
  83. 83 }
  84. 84 }
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement