method put_block (f : '-> 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