@@ -33,11 +33,11 @@ use crate::{arch, io};
3333#[ derive( Debug ) ]
3434pub ( crate ) struct RomFileInner {
3535 pub data : & ' static [ u8 ] ,
36- pub attr : FileAttr ,
36+ pub attr : RwLock < FileAttr > ,
3737}
3838
3939impl RomFileInner {
40- pub fn new ( data : & ' static [ u8 ] , attr : FileAttr ) -> Self {
40+ pub fn new ( data : & ' static [ u8 ] , attr : RwLock < FileAttr > ) -> Self {
4141 Self { data, attr }
4242 }
4343}
@@ -46,13 +46,13 @@ struct RomFileInterface {
4646 /// Position within the file
4747 pos : Mutex < usize > ,
4848 /// File content
49- inner : Arc < RwLock < RomFileInner > > ,
49+ inner : Arc < RomFileInner > ,
5050}
5151
5252#[ async_trait]
5353impl ObjectInterface for RomFileInterface {
5454 async fn poll ( & self , event : PollEvent ) -> io:: Result < PollEvent > {
55- let len = self . inner . read ( ) . await . data . len ( ) ;
55+ let len = self . inner . data . len ( ) ;
5656 let pos = * self . pos . lock ( ) . await ;
5757
5858 let ret = if pos < len {
@@ -68,11 +68,10 @@ impl ObjectInterface for RomFileInterface {
6868 {
6969 let microseconds = arch:: kernel:: systemtime:: now_micros ( ) ;
7070 let t = timespec:: from_usec ( microseconds as i64 ) ;
71- let mut guard = self . inner . write ( ) . await ;
72- guard. attr . st_atim = t;
71+ self . inner . attr . write ( ) . await . st_atim = t;
7372 }
7473
75- let vec = self . inner . read ( ) . await . data ;
74+ let vec = self . inner . data ;
7675 let mut pos_guard = self . pos . lock ( ) . await ;
7776 let pos = * pos_guard;
7877
@@ -88,11 +87,10 @@ impl ObjectInterface for RomFileInterface {
8887 }
8988
9089 async fn lseek ( & self , offset : isize , whence : SeekWhence ) -> io:: Result < isize > {
91- let guard = self . inner . read ( ) . await ;
92- let mut pos_guard = self . pos . lock ( ) . await ;
93-
9490 // NOTE: Allocations can never be larger than `isize::MAX` bytes.
95- let data_len = guard. data . len ( ) as isize ;
91+ let data_len = self . inner . data . len ( ) as isize ;
92+
93+ let mut pos_guard = self . pos . lock ( ) . await ;
9694
9795 let new_pos = match whence {
9896 SeekWhence :: Set => offset,
@@ -112,21 +110,20 @@ impl ObjectInterface for RomFileInterface {
112110 }
113111
114112 async fn fstat ( & self ) -> io:: Result < FileAttr > {
115- let guard = self . inner . read ( ) . await ;
116- Ok ( guard. attr )
113+ Ok ( * self . inner . attr . read ( ) . await )
117114 }
118115}
119116
120117impl RomFileInterface {
121- pub fn new ( inner : Arc < RwLock < RomFileInner > > ) -> Self {
118+ pub fn new ( inner : Arc < RomFileInner > ) -> Self {
122119 Self {
123120 pos : Mutex :: new ( 0 ) ,
124121 inner,
125122 }
126123 }
127124
128125 pub fn len ( & self ) -> usize {
129- block_on ( async { Ok ( self . inner . read ( ) . await . data . len ( ) ) } , None ) . unwrap ( )
126+ self . inner . data . len ( )
130127 }
131128}
132129
@@ -280,7 +277,7 @@ impl RamFileInterface {
280277
281278#[ derive( Debug ) ]
282279pub ( crate ) struct RomFile {
283- data : Arc < RwLock < RomFileInner > > ,
280+ data : Arc < RomFileInner > ,
284281}
285282
286283impl VfsNode for RomFile {
@@ -295,7 +292,7 @@ impl VfsNode for RomFile {
295292 }
296293
297294 fn get_file_attributes ( & self ) -> io:: Result < FileAttr > {
298- block_on ( async { Ok ( self . data . read ( ) . await . attr ) } , None )
295+ block_on ( async { Ok ( * self . data . attr . read ( ) . await ) } , None )
299296 }
300297
301298 fn traverse_lstat ( & self , components : & mut Vec < & str > ) -> io:: Result < FileAttr > {
@@ -319,17 +316,17 @@ impl RomFile {
319316 pub fn new ( data : & ' static [ u8 ] , mode : AccessPermission ) -> Self {
320317 let microseconds = arch:: kernel:: systemtime:: now_micros ( ) ;
321318 let t = timespec:: from_usec ( microseconds as i64 ) ;
322- let attr = FileAttr {
319+ let attr = RwLock :: new ( FileAttr {
323320 st_size : data. len ( ) . try_into ( ) . unwrap ( ) ,
324321 st_mode : mode | AccessPermission :: S_IFREG ,
325322 st_atim : t,
326323 st_mtim : t,
327324 st_ctim : t,
328325 ..Default :: default ( )
329- } ;
326+ } ) ;
330327
331328 Self {
332- data : Arc :: new ( RwLock :: new ( RomFileInner :: new ( data, attr) ) ) ,
329+ data : Arc :: new ( RomFileInner :: new ( data, attr) ) ,
333330 }
334331 }
335332}
0 commit comments