bool turn, flag[2]; bool critical0 = 0; bool critical1 = 0; active proctype user0() { int pi = 0; again: flag[0] = 1; turn = 1; (flag[1] == 0 || turn == 0); critical0 = 1; /* critical section */ critical0 = 0; flag[0] = 0; goto again; } active proctype user1() { int pi = 1; ag: flag[1] = 1; turn = 0; (flag[0] == 0 || turn == 1); critical1 = 1; /* critical section */ critical1 = 0; flag[1] = 0; goto ag; } active proctype monitor() { assert(!(critical0 && critical1)); } /** TO RUN USE: * * spin -a peterson.pml * gcc pan.c -o pan * pan * * SHOULD REPORT 0 ERRORS */