method put_block (f : 'a -> unit) =
assert (match state with `Running _ | `Crashed -> true | _ -> false) ;
Mutex.lock wait_m ;
if read <> write && write mod nb_blocks = read mod nb_blocks &&
state <> `Crashed then
Condition.wait wait_c wait_m ;
Mutex.unlock wait_m ;
f buffer.(write mod nb_blocks) ;
Mutex.lock wait_m ;
write <- (write + 1) mod (2*nb_blocks) ;
Mutex.unlock wait_m ;
Condition.signal wait_c