Windows: CommandExt::async_pipes · rust-lang/rust@740a54c (original) (raw)

`@@ -161,6 +161,37 @@ pub trait CommandExt: Sealed {

`

161

161

`` /// CommandLineToArgvW escaping rules.

``

162

162

`#[stable(feature = "windows_process_extensions_raw_arg", since = "1.62.0")]

`

163

163

`fn raw_arg<S: AsRef>(&mut self, text_to_append_as_is: S) -> &mut process::Command;

`

``

164

+

``

165

`` +

/// When [process::Command] creates pipes, request that our side is always async.

``

``

166

`+

///

`

``

167

`` +

/// By default [process::Command] may choose to use pipes where both ends

``

``

168

`+

/// are opened for synchronous read or write operations. By using

`

``

169

`` +

/// async_pipes(true), this behavior is overridden so that our side is

``

``

170

`+

/// always async.

`

``

171

`+

///

`

``

172

`+

/// This is important because if doing async I/O a pipe or a file has to be

`

``

173

`+

/// opened for async access.

`

``

174

`+

///

`

``

175

`+

/// The end of the pipe sent to the child process will always be synchronous

`

``

176

`+

/// regardless of this option.

`

``

177

`+

///

`

``

178

`+

/// # Example

`

``

179

`+

///

`

``

180


/// ```

``

181

`+

/// #![feature(windows_process_extensions_async_pipes)]

`

``

182

`+

/// use std::os::windows::process::CommandExt;

`

``

183

`+

/// use std::process::{Command, Stdio};

`

``

184

`+

///

`

``

185

`+

/// # let program = "";

`

``

186

`+

///

`

``

187

`+

/// Command::new(program)

`

``

188

`+

/// .async_pipes(true)

`

``

189

`+

/// .stdin(Stdio::piped())

`

``

190

`+

/// .stdout(Stdio::piped())

`

``

191

`+

/// .stderr(Stdio::piped());

`

``

192


/// ```

``

193

`+

#[unstable(feature = "windows_process_extensions_async_pipes", issue = "98289")]

`

``

194

`+

fn async_pipes(&mut self, always_async: bool) -> &mut process::Command;

`

164

195

`}

`

165

196

``

166

197

`#[stable(feature = "windows_process_extensions", since = "1.16.0")]

`

`@@ -179,6 +210,15 @@ impl CommandExt for process::Command {

`

179

210

`self.as_inner_mut().raw_arg(raw_text.as_ref());

`

180

211

`self

`

181

212

`}

`

``

213

+

``

214

`+

fn async_pipes(&mut self, always_async: bool) -> &mut process::Command {

`

``

215

`+

// FIXME: This currently has an intentional no-op implementation.

`

``

216

`+

// For the time being our side of the pipes will always be async.

`

``

217

`+

// Once the ecosystem has adjusted, we may then be able to start making

`

``

218

`+

// use of synchronous pipes within the standard library.

`

``

219

`+

let _ = always_async;

`

``

220

`+

self

`

``

221

`+

}

`

182

222

`}

`

183

223

``

184

224

`#[unstable(feature = "windows_process_extensions_main_thread_handle", issue = "96723")]

`