diff options
Diffstat (limited to 'tokio/src/process/windows.rs')
-rw-r--r-- | tokio/src/process/windows.rs | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/tokio/src/process/windows.rs b/tokio/src/process/windows.rs index cbe2fa75..1fbdee21 100644 --- a/tokio/src/process/windows.rs +++ b/tokio/src/process/windows.rs @@ -24,20 +24,15 @@ use mio_named_pipes::NamedPipe; use std::fmt; use std::future::Future; use std::io; -use std::os::windows::prelude::*; -use std::os::windows::process::ExitStatusExt; +use std::os::windows::prelude::{AsRawHandle, FromRawHandle, IntoRawHandle}; use std::pin::Pin; use std::process::{Child as StdChild, Command as StdCommand, ExitStatus}; use std::ptr; use std::task::Context; use std::task::Poll; -use winapi::shared::minwindef::FALSE; -use winapi::shared::winerror::WAIT_TIMEOUT; use winapi::um::handleapi::INVALID_HANDLE_VALUE; -use winapi::um::processthreadsapi::GetExitCodeProcess; -use winapi::um::synchapi::WaitForSingleObject; use winapi::um::threadpoollegacyapiset::UnregisterWaitEx; -use winapi::um::winbase::{RegisterWaitForSingleObject, INFINITE, WAIT_OBJECT_0}; +use winapi::um::winbase::{RegisterWaitForSingleObject, INFINITE}; use winapi::um::winnt::{BOOLEAN, HANDLE, PVOID, WT_EXECUTEINWAITTHREAD, WT_EXECUTEONLYONCE}; #[must_use = "futures do nothing unless polled"] @@ -86,6 +81,10 @@ impl Child { pub(crate) fn id(&self) -> u32 { self.child.id() } + + pub(crate) fn try_wait(&mut self) -> io::Result<Option<ExitStatus>> { + self.child.try_wait() + } } impl Kill for Child { @@ -106,11 +105,11 @@ impl Future for Child { Poll::Ready(Err(_)) => panic!("should not be canceled"), Poll::Pending => return Poll::Pending, } - let status = try_wait(&inner.child)?.expect("not ready yet"); + let status = inner.try_wait()?.expect("not ready yet"); return Poll::Ready(Ok(status)); } - if let Some(e) = try_wait(&inner.child)? { + if let Some(e) = inner.try_wait()? { return Poll::Ready(Ok(e)); } let (tx, rx) = oneshot::channel(); @@ -157,23 +156,6 @@ unsafe extern "system" fn callback(ptr: PVOID, _timer_fired: BOOLEAN) { let _ = complete.take().unwrap().send(()); } -pub(crate) fn try_wait(child: &StdChild) -> io::Result<Option<ExitStatus>> { - unsafe { - match WaitForSingleObject(child.as_raw_handle(), 0) { - WAIT_OBJECT_0 => {} - WAIT_TIMEOUT => return Ok(None), - _ => return Err(io::Error::last_os_error()), - } - let mut status = 0; - let rc = GetExitCodeProcess(child.as_raw_handle(), &mut status); - if rc == FALSE { - Err(io::Error::last_os_error()) - } else { - Ok(Some(ExitStatus::from_raw(status))) - } - } -} - pub(crate) type ChildStdin = PollEvented<NamedPipe>; pub(crate) type ChildStdout = PollEvented<NamedPipe>; pub(crate) type ChildStderr = PollEvented<NamedPipe>; |