diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-12-04 08:51:47 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-12-04 08:51:47 -0800 |
| commit | e0264ff192a6dcca1a9fa15a740f7ddb9890d74c (patch) | |
| tree | 7703cb633d7f466c9fcbd2db66a33a976764bcd6 | |
| parent | 91695797c2ff36017edc47af270ca665f2f4d1ef (diff) | |
| download | rust-e0264ff192a6dcca1a9fa15a740f7ddb9890d74c.tar.gz rust-e0264ff192a6dcca1a9fa15a740f7ddb9890d74c.zip | |
Don't dup the stdio file descriptors.
This is just an implementation detail of using libuv, so move the libuv-specific logic into librustuv.
| -rw-r--r-- | src/librustuv/tty.rs | 8 | ||||
| -rw-r--r-- | src/libstd/io/native/mod.rs | 4 | ||||
| -rw-r--r-- | src/libstd/io/stdio.rs | 14 |
3 files changed, 13 insertions, 13 deletions
diff --git a/src/librustuv/tty.rs b/src/librustuv/tty.rs index 1cac5872ed3..fcad6296579 100644 --- a/src/librustuv/tty.rs +++ b/src/librustuv/tty.rs @@ -44,6 +44,14 @@ impl TtyWatcher { return Err(UvError(uvll::EBADF)); } + // libuv was recently changed to not close the stdio file descriptors, + // but it did not change the behavior for windows. Until this issue is + // fixed, we need to dup the stdio file descriptors because otherwise + // uv_close will close them + let fd = if cfg!(windows) && fd <= libc::STDERR_FILENO { + unsafe { libc::dup(fd) } + } else { fd }; + // If this file descriptor is indeed guessed to be a tty, then go ahead // with attempting to open it as a tty. let handle = UvHandle::alloc(None::<TtyWatcher>, uvll::UV_TTY); diff --git a/src/libstd/io/native/mod.rs b/src/libstd/io/native/mod.rs index cec0de00ec2..c92f480728e 100644 --- a/src/libstd/io/native/mod.rs +++ b/src/libstd/io/native/mod.rs @@ -206,7 +206,9 @@ impl rtio::IoFactory for IoFactory { } fn tty_open(&mut self, fd: c_int, _readable: bool) -> IoResult<~RtioTTY> { if unsafe { libc::isatty(fd) } != 0 { - Ok(~file::FileDesc::new(fd, true) as ~RtioTTY) + // Don't ever close the stdio file descriptors, nothing good really + // comes of that. + Ok(~file::FileDesc::new(fd, fd > libc::STDERR_FILENO) as ~RtioTTY) } else { Err(IoError { kind: io::MismatchedFileTypeForOperation, diff --git a/src/libstd/io/stdio.rs b/src/libstd/io/stdio.rs index fe0385c9a95..466a65a227e 100644 --- a/src/libstd/io/stdio.rs +++ b/src/libstd/io/stdio.rs @@ -31,8 +31,7 @@ use libc; use option::{Option, Some, None}; use result::{Ok, Err}; use io::buffered::LineBufferedWriter; -use rt::rtio::{IoFactory, RtioTTY, RtioFileStream, with_local_io, - CloseAsynchronously}; +use rt::rtio::{IoFactory, RtioTTY, RtioFileStream, with_local_io, DontClose}; use super::{Reader, Writer, io_error, IoError, OtherIoError, standard_error, EndOfFile}; @@ -71,18 +70,9 @@ enum StdSource { fn src<T>(fd: libc::c_int, readable: bool, f: |StdSource| -> T) -> T { with_local_io(|io| { - let fd = unsafe { libc::dup(fd) }; match io.tty_open(fd, readable) { Ok(tty) => Some(f(TTY(tty))), - Err(_) => { - // It's not really that desirable if these handles are closed - // synchronously, and because they're squirreled away in a task - // structure the destructors will be run when the task is - // attempted to get destroyed. This means that if we run a - // synchronous destructor we'll attempt to do some scheduling - // operations which will just result in sadness. - Some(f(File(io.fs_from_raw_fd(fd, CloseAsynchronously)))) - } + Err(_) => Some(f(File(io.fs_from_raw_fd(fd, DontClose)))), } }).unwrap() } |
