int lk = 0, r_want = 0, r_lock = 0, sleep_q = 0;
enum { Wakeme, Running } State = Running;

void _before()
{
  lk = r_want = r_lock = sleep_q = 0;
  State = Running;
}

void _hash(unsigned int *h)
{
  _hash_int(lk, h);
  _hash_int(r_want, h);
  _hash_int(r_lock, h);
  _hash_int(sleep_q, h);
  _hash_int(State, h);
}

void _print(char *tmp)
{
  sprintf(tmp, "   lk = %i\n", lk);
  sprintf(&tmp[strlen(tmp)], "   r_want = %i\n", r_want);
  sprintf(&tmp[strlen(tmp)], "   r_lock = %i\n", r_lock);
  sprintf(&tmp[strlen(tmp)], "   sleep_q = %i\n", sleep_q);

  State == Wakeme ?
    sprintf(&tmp[strlen(tmp)], "   State = Wakeme\n") :
    sprintf(&tmp[strlen(tmp)], "   State = Running\n");
}

%%

c3;   (lk == 0);          {lk = 1;};                       c11;
c5;   -;                  {r_want = 1;};                   c6;
c6;   -;                  {State = Wakeme;};               c7;
c7;   -;                  {lk = 0;};                       c8;
c8;   (State == Running); -;                               c3;
c11;  (r_lock == 1);      -;                               c5;
c11;  (r_lock == 0);      -;                               c14;
c14;  (r_lock == 0);      #progress;                       c15;
c14;  (r_lock != 0);      #progress,_c14_assert_violated;  c15;
c15;  -;                  {r_lock = 1;};                   c16;
c16;  -;                  {lk = 0;};                       c3;

s1;  -;                 {r_lock = 0;};      s2;
s2;  (lk == 0);         -;                  s15;
s6;  (sleep_q == 0);    {sleep_q = 1;};     s7;
s7;  -;                 {r_want = 0;};      s11;
s9;  -;                 {State = Running;}; s13;
s11; (State == Wakeme); -;                  s9;
s11; (State != Wakeme); -;                  s13;
s13; -;                 {sleep_q = 0;};     s1;
s15; (r_want == 1);     -;                  s6;
s15; (r_want != 1);     -;                  s1;

no_progress;
#progress; -; -; no_progress;







