diff options
author | Yoshiya Hinosawa <stibium121@gmail.com> | 2018-12-23 13:53:29 +0900 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-12-22 23:53:29 -0500 |
commit | bee55fcd20b4919f2d6b4817ce33d1a09e6bcadc (patch) | |
tree | 136a018c630afdb97b8b810b3dedb5745ca8125b /src/resources.rs | |
parent | cbee2895b3643aaccd62b221bf1bb4ac6a1ca9fb (diff) |
make stdout unbuffered (#1355)
Diffstat (limited to 'src/resources.rs')
-rw-r--r-- | src/resources.rs | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/resources.rs b/src/resources.rs index 75612e574..dd1ad0056 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -43,6 +43,18 @@ pub type ResourceId = u32; // Sometimes referred to RID. // system ones. type ResourceTable = HashMap<ResourceId, Repr>; +#[cfg(not(windows))] +use std::os::unix::io::FromRawFd; + +#[cfg(windows)] +use std::os::windows::io::FromRawHandle; + +#[cfg(windows)] +extern crate kernel32; + +#[cfg(windows)] +extern crate winapi; + lazy_static! { // Starts at 3 because stdio is [0-2]. static ref NEXT_RID: AtomicUsize = AtomicUsize::new(3); @@ -50,7 +62,18 @@ lazy_static! { let mut m = HashMap::new(); // TODO Load these lazily during lookup? m.insert(0, Repr::Stdin(tokio::io::stdin())); - m.insert(1, Repr::Stdout(tokio::io::stdout())); + + m.insert(1, Repr::Stdout({ + #[cfg(not(windows))] + let stdout = unsafe { std::fs::File::from_raw_fd(1) }; + #[cfg(windows)] + let stdout = unsafe { + std::fs::File::from_raw_handle(kernel32::GetStdHandle( + winapi::um::winbase::STD_OUTPUT_HANDLE)) + }; + tokio::fs::File::from_std(stdout) + })); + m.insert(2, Repr::Stderr(tokio::io::stderr())); m }); @@ -59,7 +82,7 @@ lazy_static! { // Internal representation of Resource. enum Repr { Stdin(tokio::io::Stdin), - Stdout(tokio::io::Stdout), + Stdout(tokio::fs::File), Stderr(tokio::io::Stderr), FsFile(tokio::fs::File), TcpListener(tokio::net::TcpListener), |