(************************************************************************) (* v * The Coq Proof Assistant / The Coq Development Team *) (* while not (Thread.wait_timed_read fd 1.0) do Thread.yield () done; loop () in loop () let thread_friendly_read ic s ~off ~len = try let fd = Unix.descr_of_in_channel ic in thread_friendly_read_fd fd s ~off ~len with Unix.Unix_error _ -> 0 let really_read_fd fd s off len = let i = ref 0 in while !i < len do let off = off + !i in let len = len - !i in let r = thread_friendly_read_fd fd s ~off ~len in if r = 0 then raise End_of_file; i := !i + r done let thread_friendly_input_value ic = try let fd = Unix.descr_of_in_channel ic in let header = String.create Marshal.header_size in really_read_fd fd header 0 Marshal.header_size; let body_size = Marshal.data_size header 0 in let msg = String.create (body_size + Marshal.header_size) in String.blit header 0 msg 0 Marshal.header_size; really_read_fd fd msg Marshal.header_size body_size; Marshal.from_string msg 0 with Unix.Unix_error _ -> raise End_of_file