1
- use std:: { io , mem :: ManuallyDrop , os :: fd :: FromRawFd } ;
1
+ use std:: io ;
2
2
3
3
use compio_buf:: { BufResult , IoBuf , IoBufMut , IoVectoredBuf , IoVectoredBufMut } ;
4
4
use compio_driver:: { AsRawFd , RawFd } ;
5
5
use compio_io:: { AsyncRead , AsyncWrite } ;
6
6
7
7
#[ cfg( doc) ]
8
8
use super :: { stderr, stdin, stdout} ;
9
- use crate :: pipe :: { Receiver , Sender } ;
9
+ use crate :: AsyncFd ;
10
10
11
11
/// A handle to the standard input stream of a process.
12
12
///
13
13
/// See [`stdin`].
14
14
#[ derive( Debug , Clone ) ]
15
- pub struct Stdin ( ManuallyDrop < Receiver > ) ;
15
+ pub struct Stdin ( AsyncFd < RawFd > ) ;
16
16
17
17
impl Stdin {
18
18
pub ( crate ) fn new ( ) -> Self {
19
- // SAFETY: we don't drop it
20
- Self ( ManuallyDrop :: new ( unsafe {
21
- Receiver :: from_raw_fd ( libc:: STDIN_FILENO )
22
- } ) )
19
+ // SAFETY: no need to attach on unix
20
+ Self ( unsafe { AsyncFd :: new_unchecked ( libc:: STDIN_FILENO ) } )
23
21
}
24
22
}
25
23
26
24
impl AsyncRead for Stdin {
27
25
async fn read < B : IoBufMut > ( & mut self , buf : B ) -> BufResult < usize , B > {
28
- self . 0 . read ( buf) . await
26
+ ( & * self ) . read ( buf) . await
29
27
}
30
28
31
29
async fn read_vectored < V : IoVectoredBufMut > ( & mut self , buf : V ) -> BufResult < usize , V > {
32
- self . 0 . read_vectored ( buf) . await
30
+ ( & * self ) . read_vectored ( buf) . await
31
+ }
32
+ }
33
+
34
+ impl AsyncRead for & Stdin {
35
+ async fn read < B : IoBufMut > ( & mut self , buf : B ) -> BufResult < usize , B > {
36
+ ( & self . 0 ) . read ( buf) . await
37
+ }
38
+
39
+ async fn read_vectored < V : IoVectoredBufMut > ( & mut self , buf : V ) -> BufResult < usize , V > {
40
+ ( & self . 0 ) . read_vectored ( buf) . await
33
41
}
34
42
}
35
43
@@ -43,14 +51,12 @@ impl AsRawFd for Stdin {
43
51
///
44
52
/// See [`stdout`].
45
53
#[ derive( Debug , Clone ) ]
46
- pub struct Stdout ( ManuallyDrop < Sender > ) ;
54
+ pub struct Stdout ( AsyncFd < RawFd > ) ;
47
55
48
56
impl Stdout {
49
57
pub ( crate ) fn new ( ) -> Self {
50
- // SAFETY: we don't drop it
51
- Self ( ManuallyDrop :: new ( unsafe {
52
- Sender :: from_raw_fd ( libc:: STDOUT_FILENO )
53
- } ) )
58
+ // SAFETY: no need to attach on unix
59
+ Self ( unsafe { AsyncFd :: new_unchecked ( libc:: STDOUT_FILENO ) } )
54
60
}
55
61
}
56
62
@@ -82,14 +88,12 @@ impl AsRawFd for Stdout {
82
88
///
83
89
/// See [`stderr`].
84
90
#[ derive( Debug , Clone ) ]
85
- pub struct Stderr ( ManuallyDrop < Sender > ) ;
91
+ pub struct Stderr ( AsyncFd < RawFd > ) ;
86
92
87
93
impl Stderr {
88
94
pub ( crate ) fn new ( ) -> Self {
89
- // SAFETY: we don't drop it
90
- Self ( ManuallyDrop :: new ( unsafe {
91
- Sender :: from_raw_fd ( libc:: STDERR_FILENO )
92
- } ) )
95
+ // SAFETY: no need to attach on unix
96
+ Self ( unsafe { AsyncFd :: new_unchecked ( libc:: STDERR_FILENO ) } )
93
97
}
94
98
}
95
99
0 commit comments