let update_signal mtx cnd ~f = critical_section mtx ~f:(fun () -> let res = f () in Condition.signal cnd; res)