Producer:
Repeat
$P1$. Produce an item;
$P2$. if count $= 1$ then sleep;
$P3$. place item in buffer.
$P4$. count $= 1$;
$P5$. Wakeup(Consumer);
Forever
Consumer:
Repeat
$C1$. if count $= 0$ then sleep;
$C2$. Remove item from buffer;
$C3$. count $= 0$;
$C4$. Wakeup(Producer);
$C5$. Consume item;
Forever;
Initially Count$=0$;
Producer starts first, and execute following steps:
$P1$
$P2$
$P3$
Producer preempts here.
Consumer executes the following step:
$C1$ and before it goes to sleep(waiting state) it got preempted.and went to ready state.
Producer resumes its execution
$P4$. set count $=1$
$P5$. wakeup(Consumer) but consumer is not actually blocked.
Producer preempts here.
Consumer Resumes its execution:
It completes second of half of the $C1$ and goes to sleep.
Producer resumes its execution, and executes
$P1$
$P2$ and Producer also goes to sleep.
Hence, Producer and Consumer both are sleeping.