wasi_net/process/
child_stdout.rs

1use 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}