void put (char ch) @{
lock_acquire (&lock);
- while (n == BUF_SIZE) /* @r{Can't add to @var{buf} as long as it's full.} */
- cond_wait (¬_full);
- buf[head++ % BUF_SIZE] = ch; /* @r{Add @var{ch} to @var{buf}.} */
+ while (n == BUF_SIZE) /* @r{Can't add to @var{buf} as long as it's full.} */
+ cond_wait (¬_full, &lock);
+ buf[head++ % BUF_SIZE] = ch; /* @r{Add @var{ch} to @var{buf}.} */
n++;
- cond_signal (¬_empty); /* @r{@var{buf} can't be empty anymore.} */
+ cond_signal (¬_empty, &lock); /* @r{@var{buf} can't be empty anymore.} */
lock_release (&lock);
@}
char get (void) @{
char ch;
lock_acquire (&lock);
- while (n == 0) /* @r{Can't read from @var{buf} as long as it's empty.} */
- cond_wait (¬_empty);
- ch = buf[tail++ % BUF_SIZE]; /* @r{Get @var{ch} from @var{buf}.} */
+ while (n == 0) /* @r{Can't read from @var{buf} as long as it's empty.} */
+ cond_wait (¬_empty, &lock);
+ ch = buf[tail++ % BUF_SIZE]; /* @r{Get @var{ch} from @var{buf}.} */
n--;
- cond_signal (¬_full); /* @r{@var{buf} can't be full anymore.} */
+ cond_signal (¬_full, &lock); /* @r{@var{buf} can't be full anymore.} */
lock_release (&lock);
@}
@end example