Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.81 KB | None | 0 0
  1. #define N 10
  2.  
  3. #define NORMAL 0
  4. #define SLEEP 1
  5. #define ENLIGHTENED 2
  6.  
  7. chan forks[N] = [1] of { int };
  8. chan nudge[N] = [0] of { int };
  9. int silverware[N];
  10. int state[N];
  11.  
  12. int inactive = 0;
  13.  
  14. hidden int nil;
  15.  
  16. inline maybe_sleep() {
  17.   if
  18.   :: skip;
  19.   :: atomic {
  20.       nudge_neigbors();
  21.       printf("Fell asleep\n");
  22.       state[me] = SLEEP;
  23.       inactive++;
  24.       nudge[me]?1;
  25.       inactive--;
  26.       state[me] = NORMAL;
  27.       printf("Woken up\n");
  28.     }
  29.   fi
  30. }
  31.  
  32. inline nudge_neigbors() {
  33.   atomic {
  34.     //printf("Nudging neigbors\n");
  35.     printf("%d < > %d\n", state[left], state[right]);
  36.     if
  37.     :: (state[left] == SLEEP) -> nudge[left]!nil;
  38.     :: else;
  39.     fi
  40.     if
  41.     :: (state[right] == SLEEP) -> nudge[right]!nil;
  42.     :: else;
  43.     fi
  44.     //printf("Finished nudging\n");
  45.   }
  46. }
  47.  
  48. active [N] proctype philosopher() {
  49.   int left = _pid - 1;
  50.   if
  51.   :: (left < 0) -> left = left + N;
  52.   :: else;
  53.   fi
  54.   int right = (_pid + 1) % N;
  55.   int me = _pid;
  56.  
  57.   int left_handed = me == 0;
  58.  
  59.   do
  60.   :: {
  61.  
  62.       // think
  63.       printf("Thinking\n");
  64.       if
  65.       :: skip;
  66.       :: {
  67.           state[me] = ENLIGHTENED;
  68.           printf("Became enlightened\n");
  69.         }
  70.       fi
  71.       maybe_sleep();
  72.  
  73.       // hungry
  74.       printf("Hungry\n");
  75.       maybe_sleep();
  76.        
  77.       int fork1, fork2 = -1;
  78.  
  79.       if
  80.       :: (state[me] == ENLIGHTENED) -> {
  81.           int i;
  82.           printf("Looking for forks\n");
  83.  
  84.           // take first fork
  85.           silverware[me]++;
  86.           inactive++;
  87.           do
  88.           :: (fork1 == -1) -> {
  89.               for (i in forks) {
  90.                 atomic {
  91.                   if
  92.                   :: (full(forks[i])) -> {
  93.                       forks[i]?nil;
  94.                       inactive--;
  95.                       silverware[me]++;
  96.                       fork1 = i;
  97.                       printf("Took fork %d\n", fork1);
  98.                       break;
  99.                     }
  100.                   :: (nfull(forks[i])) -> break;
  101.                   fi
  102.                 }
  103.               }
  104.              nudge_neigbors();
  105.             }
  106.           :: else -> break;
  107.           od
  108.  
  109.           // take second fork
  110.           do
  111.           :: (fork2 == -1) -> {
  112.               for (i in forks) {
  113.                 atomic {
  114.                   if
  115.                   :: (nfull(forks[i]) && fork1 == i) -> skip;
  116.                   :: (full(forks[i]) && fork1 != i) -> {
  117.                       forks[i]?nil;
  118.                       inactive--;
  119.                       silverware[me]++;
  120.                       fork2 = i;
  121.                       printf("Took fork %d\n", fork2);
  122.                       break;
  123.                     }
  124.                   :: (nfull(forks[i]) && fork1 != i) -> break;
  125.                   fi
  126.                 }
  127.               }
  128.               nudge_neigbors();
  129.             }
  130.           :: else -> break;
  131.           od
  132.         }
  133.       :: else -> {
  134.           printf("Picking up nearby forks\n");
  135.           if
  136.           :: (left_handed) -> {
  137.  
  138.               atomic {
  139.                 // take right fork
  140.                 silverware[me]++;
  141.                 inactive++;
  142.                 forks[right]?nil;
  143.                 inactive--;
  144.                 fork2 = right;
  145.                 printf("Took fork %d\n", fork2);
  146.               }
  147.  
  148.               atomic {
  149.                 // take left fork
  150.                 silverware[me]++;
  151.                 inactive++;
  152.                 forks[me]?nil;
  153.                 inactive--;
  154.                 fork1 = me;
  155.                 printf("Took fork %d\n", fork1);
  156.                 silverware[me]++;
  157.               }
  158.             }
  159.           :: else -> {
  160.               atomic {
  161.                 // take left fork
  162.                 silverware[me]++;
  163.                 inactive++;
  164.                 forks[me]?nil;
  165.                 inactive--;
  166.                 fork1 = me;
  167.                 printf("Took fork %d\n", fork1);
  168.               }
  169.  
  170.               atomic {
  171.                 // take right fork
  172.                 silverware[me]++;
  173.                 inactive++;
  174.                 forks[right]?nil;
  175.                 inactive--;
  176.                 fork2 = right;
  177.                 printf("Took fork %d\n", fork2);
  178.                 silverware[me]++;
  179.               }
  180.             }
  181.           fi
  182.         }
  183.       fi
  184.  
  185.       // eat
  186.       printf("Eating\n")
  187.  
  188.       // return forks
  189.       forks[fork1]!1;
  190.       silverware[me]--;
  191.       printf("Returned fork %d\n", fork1);
  192.       forks[fork2]!1;
  193.       silverware[me]--;
  194.       printf("Returned fork %d\n", fork2);
  195.       silverware[me]--;
  196.       maybe_sleep();
  197.     }
  198.   od
  199. }
  200.  
  201. init {
  202.   atomic {
  203.     int i;
  204.     for (i in forks) {
  205.       forks[i]!1;
  206.       silverware[i] = -1;
  207.       state[i] = NORMAL;
  208.     }
  209.   }
  210.   do
  211.   :: {
  212.     //printf("inactive: %d\n", inactive);
  213.     assert(inactive < N);
  214.   }
  215.   od
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement