From: bors Date: Thu, 8 May 2014 00:21:37 +0000 (-0700) Subject: auto merge of #13751 : alexcrichton/rust/io-close-read, r=brson X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=ab22d99e73f81f35dd4edbdc9b27152dc653f5b6;p=rust.git auto merge of #13751 : alexcrichton/rust/io-close-read, r=brson Two new methods were added to TcpStream and UnixStream: fn close_read(&mut self) -> IoResult<()>; fn close_write(&mut self) -> IoResult<()>; These two methods map to shutdown()'s behavior (the system call on unix), closing the reading or writing half of a duplex stream. These methods are primarily added to allow waking up a pending read in another task. By closing the reading half of a connection, all pending readers will be woken up and will return with EndOfFile. The close_write() method was added for symmetry with close_read(), and I imagine that it will be quite useful at some point. Implementation-wise, librustuv got the short end of the stick this time. The native versions just delegate to the shutdown() syscall (easy). The uv versions can leverage uv_shutdown() for tcp/unix streams, but only for closing the writing half. Closing the reading half is done through some careful dancing to wake up a pending reader. As usual, windows likes to be different from unix. The windows implementation uses shutdown() for sockets, but shutdown() is not available for named pipes. Instead, CancelIoEx was used with same fancy synchronization to make sure everyone knows what's up. cc #11165 --- ab22d99e73f81f35dd4edbdc9b27152dc653f5b6