wasi_net/process/
child_stdout.rs1use bytes::*;
2use std::io::Read;
3use std::sync::mpsc;
4use std::sync::Arc;
5use std::sync::Mutex;
6
7use super::*;
8
9#[derive(Debug)]
10pub struct ChildStdout {
11 pub(super) rx: mpsc::Receiver<Vec<u8>>,
12 pub(super) buffer: BytesMut,
13 pub(super) worker: Arc<Mutex<Worker>>,
14}
15
16impl Read for ChildStdout {
17 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
18 loop {
19 if self.buffer.has_remaining() {
20 let max = self.buffer.remaining().min(buf.len());
21 buf[0..max].copy_from_slice(&self.buffer[..max]);
22 self.buffer.advance(max);
23 return Ok(max);
24 } else {
25 match self.rx.try_recv() {
26 Ok(data) => {
27 self.buffer.extend_from_slice(&data[..]);
28 }
29 Err(mpsc::TryRecvError::Disconnected) => {
30 return Ok(0usize);
31 }
32 Err(mpsc::TryRecvError::Empty) => {
33 let mut worker = self.worker.lock().unwrap();
34 if let Ok(data) = self.rx.try_recv() {
35 self.buffer.extend_from_slice(&data[..]);
36 continue;
37 }
38 worker.work()?;
39 }
40 }
41 }
42 }
43 }
44}