@@ -5,7 +5,6 @@ use is_terminal::IsTerminal;
55use std:: any:: Any ;
66use std:: convert:: TryInto ;
77use std:: io;
8- use std:: sync:: { Arc , RwLock , RwLockReadGuard } ;
98use system_interface:: {
109 fs:: { FileIoExt , GetSetFdFlags } ,
1110 io:: { IoExt , ReadReady } ,
@@ -15,48 +14,11 @@ use wasi_common::{
1514 Error , ErrorExt ,
1615} ;
1716
18- #[ cfg( unix) ]
19- use io_lifetimes:: { AsFd , BorrowedFd } ;
20-
21- #[ cfg( windows) ]
22- use io_lifetimes:: { AsHandle , BorrowedHandle } ;
23-
24- #[ cfg( windows) ]
25- use io_extras:: os:: windows:: { AsRawHandleOrSocket , RawHandleOrSocket } ;
26-
27- pub struct BorrowedFile < ' a > ( RwLockReadGuard < ' a , cap_std:: fs:: File > ) ;
28-
29- #[ cfg( unix) ]
30- impl AsFd for BorrowedFile < ' _ > {
31- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
32- self . 0 . as_fd ( )
33- }
34- }
35-
36- #[ cfg( windows) ]
37- impl AsHandle for BorrowedFile < ' _ > {
38- fn as_handle ( & self ) -> BorrowedHandle < ' _ > {
39- self . 0 . as_handle ( )
40- }
41- }
42-
43- #[ cfg( windows) ]
44- impl AsRawHandleOrSocket for BorrowedFile < ' _ > {
45- #[ inline]
46- fn as_raw_handle_or_socket ( & self ) -> RawHandleOrSocket {
47- self . 0 . as_raw_handle_or_socket ( )
48- }
49- }
50-
51- pub struct File ( RwLock < cap_std:: fs:: File > ) ;
17+ pub struct File ( cap_std:: fs:: File ) ;
5218
5319impl File {
5420 pub fn from_cap_std ( file : cap_std:: fs:: File ) -> Self {
55- File ( RwLock :: new ( file) )
56- }
57-
58- pub fn borrow ( & self ) -> BorrowedFile {
59- BorrowedFile ( self . 0 . read ( ) . unwrap ( ) )
21+ File ( file)
6022 }
6123}
6224
@@ -65,32 +27,28 @@ impl WasiFile for File {
6527 fn as_any ( & self ) -> & dyn Any {
6628 self
6729 }
68-
6930 #[ cfg( unix) ]
70- fn pollable ( & self ) -> Option < Arc < dyn AsFd + ' _ > > {
71- Some ( Arc :: new ( self . borrow ( ) ) )
31+ fn pollable ( & self ) -> Option < rustix :: fd :: BorrowedFd > {
32+ Some ( self . 0 . as_fd ( ) )
7233 }
73-
7434 #[ cfg( windows) ]
75- fn pollable ( & self ) -> Option < Arc < dyn AsRawHandleOrSocket + ' _ > > {
76- Some ( Arc :: new ( BorrowedFile ( self . 0 . read ( ) . unwrap ( ) ) ) )
35+ fn pollable ( & self ) -> Option < io_extras :: os :: windows :: RawHandleOrSocket > {
36+ Some ( self . 0 . as_raw_handle_or_socket ( ) )
7737 }
78-
7938 async fn datasync ( & self ) -> Result < ( ) , Error > {
80- self . 0 . read ( ) . unwrap ( ) . sync_data ( ) ?;
39+ self . 0 . sync_data ( ) ?;
8140 Ok ( ( ) )
8241 }
8342 async fn sync ( & self ) -> Result < ( ) , Error > {
84- self . 0 . read ( ) . unwrap ( ) . sync_all ( ) ?;
43+ self . 0 . sync_all ( ) ?;
8544 Ok ( ( ) )
8645 }
8746 async fn get_filetype ( & self ) -> Result < FileType , Error > {
88- let meta = self . 0 . read ( ) . unwrap ( ) . metadata ( ) ?;
47+ let meta = self . 0 . metadata ( ) ?;
8948 Ok ( filetype_from ( & meta. file_type ( ) ) )
9049 }
9150 async fn get_fdflags ( & self ) -> Result < FdFlags , Error > {
92- let file = self . 0 . read ( ) . unwrap ( ) ;
93- let fdflags = get_fd_flags ( & * file) ?;
51+ let fdflags = get_fd_flags ( & self . 0 ) ?;
9452 Ok ( fdflags)
9553 }
9654 async fn set_fdflags ( & mut self , fdflags : FdFlags ) -> Result < ( ) , Error > {
@@ -101,13 +59,12 @@ impl WasiFile for File {
10159 ) {
10260 return Err ( Error :: invalid_argument ( ) . context ( "cannot set DSYNC, SYNC, or RSYNC flag" ) ) ;
10361 }
104- let file = self . 0 . get_mut ( ) . unwrap ( ) ;
105- let set_fd_flags = ( * file) . new_set_fd_flags ( to_sysif_fdflags ( fdflags) ) ?;
106- ( * file) . set_fd_flags ( set_fd_flags) ?;
62+ let set_fd_flags = self . 0 . new_set_fd_flags ( to_sysif_fdflags ( fdflags) ) ?;
63+ self . 0 . set_fd_flags ( set_fd_flags) ?;
10764 Ok ( ( ) )
10865 }
10966 async fn get_filestat ( & self ) -> Result < Filestat , Error > {
110- let meta = self . 0 . read ( ) . unwrap ( ) . metadata ( ) ?;
67+ let meta = self . 0 . metadata ( ) ?;
11168 Ok ( Filestat {
11269 device_id : meta. dev ( ) ,
11370 inode : meta. ino ( ) ,
@@ -120,18 +77,15 @@ impl WasiFile for File {
12077 } )
12178 }
12279 async fn set_filestat_size ( & self , size : u64 ) -> Result < ( ) , Error > {
123- self . 0 . read ( ) . unwrap ( ) . set_len ( size) ?;
80+ self . 0 . set_len ( size) ?;
12481 Ok ( ( ) )
12582 }
12683 async fn advise ( & self , offset : u64 , len : u64 , advice : Advice ) -> Result < ( ) , Error > {
127- self . 0
128- . read ( )
129- . unwrap ( )
130- . advise ( offset, len, convert_advice ( advice) ) ?;
84+ self . 0 . advise ( offset, len, convert_advice ( advice) ) ?;
13185 Ok ( ( ) )
13286 }
13387 async fn allocate ( & self , offset : u64 , len : u64 ) -> Result < ( ) , Error > {
134- self . 0 . read ( ) . unwrap ( ) . allocate ( offset, len) ?;
88+ self . 0 . allocate ( offset, len) ?;
13589 Ok ( ( ) )
13690 }
13791 async fn set_times (
@@ -140,47 +94,45 @@ impl WasiFile for File {
14094 mtime : Option < wasi_common:: SystemTimeSpec > ,
14195 ) -> Result < ( ) , Error > {
14296 self . 0
143- . read ( )
144- . unwrap ( )
14597 . set_times ( convert_systimespec ( atime) , convert_systimespec ( mtime) ) ?;
14698 Ok ( ( ) )
14799 }
148100 async fn read_vectored < ' a > ( & self , bufs : & mut [ io:: IoSliceMut < ' a > ] ) -> Result < u64 , Error > {
149- let n = self . 0 . read ( ) . unwrap ( ) . read_vectored ( bufs) ?;
101+ let n = self . 0 . read_vectored ( bufs) ?;
150102 Ok ( n. try_into ( ) ?)
151103 }
152104 async fn read_vectored_at < ' a > (
153105 & self ,
154106 bufs : & mut [ io:: IoSliceMut < ' a > ] ,
155107 offset : u64 ,
156108 ) -> Result < u64 , Error > {
157- let n = self . 0 . read ( ) . unwrap ( ) . read_vectored_at ( bufs, offset) ?;
109+ let n = self . 0 . read_vectored_at ( bufs, offset) ?;
158110 Ok ( n. try_into ( ) ?)
159111 }
160112 async fn write_vectored < ' a > ( & self , bufs : & [ io:: IoSlice < ' a > ] ) -> Result < u64 , Error > {
161- let n = self . 0 . read ( ) . unwrap ( ) . write_vectored ( bufs) ?;
113+ let n = self . 0 . write_vectored ( bufs) ?;
162114 Ok ( n. try_into ( ) ?)
163115 }
164116 async fn write_vectored_at < ' a > (
165117 & self ,
166118 bufs : & [ io:: IoSlice < ' a > ] ,
167119 offset : u64 ,
168120 ) -> Result < u64 , Error > {
169- let n = self . 0 . read ( ) . unwrap ( ) . write_vectored_at ( bufs, offset) ?;
121+ let n = self . 0 . write_vectored_at ( bufs, offset) ?;
170122 Ok ( n. try_into ( ) ?)
171123 }
172124 async fn seek ( & self , pos : std:: io:: SeekFrom ) -> Result < u64 , Error > {
173- Ok ( self . 0 . read ( ) . unwrap ( ) . seek ( pos) ?)
125+ Ok ( self . 0 . seek ( pos) ?)
174126 }
175127 async fn peek ( & self , buf : & mut [ u8 ] ) -> Result < u64 , Error > {
176- let n = self . 0 . read ( ) . unwrap ( ) . peek ( buf) ?;
128+ let n = self . 0 . peek ( buf) ?;
177129 Ok ( n. try_into ( ) ?)
178130 }
179131 fn num_ready_bytes ( & self ) -> Result < u64 , Error > {
180- Ok ( self . 0 . read ( ) . unwrap ( ) . num_ready_bytes ( ) ?)
132+ Ok ( self . 0 . num_ready_bytes ( ) ?)
181133 }
182134 fn isatty ( & self ) -> bool {
183- self . 0 . read ( ) . unwrap ( ) . is_terminal ( )
135+ self . 0 . is_terminal ( )
184136 }
185137}
186138
@@ -207,6 +159,35 @@ pub fn filetype_from(ft: &cap_std::fs::FileType) -> FileType {
207159 }
208160}
209161
162+ #[ cfg( windows) ]
163+ use io_lifetimes:: { AsHandle , BorrowedHandle } ;
164+ #[ cfg( windows) ]
165+ impl AsHandle for File {
166+ fn as_handle ( & self ) -> BorrowedHandle < ' _ > {
167+ self . 0 . as_handle ( )
168+ }
169+ }
170+
171+ #[ cfg( windows) ]
172+ use io_extras:: os:: windows:: { AsRawHandleOrSocket , RawHandleOrSocket } ;
173+ #[ cfg( windows) ]
174+ impl AsRawHandleOrSocket for File {
175+ #[ inline]
176+ fn as_raw_handle_or_socket ( & self ) -> RawHandleOrSocket {
177+ self . 0 . as_raw_handle_or_socket ( )
178+ }
179+ }
180+
181+ #[ cfg( unix) ]
182+ use io_lifetimes:: { AsFd , BorrowedFd } ;
183+
184+ #[ cfg( unix) ]
185+ impl AsFd for File {
186+ fn as_fd ( & self ) -> BorrowedFd < ' _ > {
187+ self . 0 . as_fd ( )
188+ }
189+ }
190+
210191pub ( crate ) fn convert_systimespec (
211192 t : Option < wasi_common:: SystemTimeSpec > ,
212193) -> Option < SystemTimeSpec > {
0 commit comments