summaryrefslogtreecommitdiffstats
path: root/tokio/src/process/windows.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tokio/src/process/windows.rs')
-rw-r--r--tokio/src/process/windows.rs34
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>;