@@ -33,26 +33,29 @@ 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 {
4040 pub fn new ( data : & ' static [ u8 ] , attr : FileAttr ) -> Self {
41- Self { data, attr }
41+ Self {
42+ data,
43+ attr : RwLock :: new ( attr) ,
44+ }
4245 }
4346}
4447
4548struct RomFileInterface {
4649 /// Position within the file
4750 pos : Mutex < usize > ,
4851 /// File content
49- inner : Arc < RwLock < RomFileInner > > ,
52+ inner : Arc < RomFileInner > ,
5053}
5154
5255#[ async_trait]
5356impl ObjectInterface for RomFileInterface {
5457 async fn poll ( & self , event : PollEvent ) -> io:: Result < PollEvent > {
55- let len = self . inner . read ( ) . await . data . len ( ) ;
58+ let len = self . inner . data . len ( ) ;
5659 let pos = * self . pos . lock ( ) . await ;
5760
5861 let ret = if pos < len {
@@ -68,11 +71,10 @@ impl ObjectInterface for RomFileInterface {
6871 {
6972 let microseconds = arch:: kernel:: systemtime:: now_micros ( ) ;
7073 let t = timespec:: from_usec ( microseconds as i64 ) ;
71- let mut guard = self . inner . write ( ) . await ;
72- guard. attr . st_atim = t;
74+ self . inner . attr . write ( ) . await . st_atim = t;
7375 }
7476
75- let vec = self . inner . read ( ) . await . data ;
77+ let vec = self . inner . data ;
7678 let mut pos_guard = self . pos . lock ( ) . await ;
7779 let pos = * pos_guard;
7880
@@ -88,11 +90,10 @@ impl ObjectInterface for RomFileInterface {
8890 }
8991
9092 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-
9493 // NOTE: Allocations can never be larger than `isize::MAX` bytes.
95- let data_len = guard. data . len ( ) as isize ;
94+ let data_len = self . inner . data . len ( ) as isize ;
95+
96+ let mut pos_guard = self . pos . lock ( ) . await ;
9697
9798 let new_pos = match whence {
9899 SeekWhence :: Set => offset,
@@ -112,21 +113,20 @@ impl ObjectInterface for RomFileInterface {
112113 }
113114
114115 async fn fstat ( & self ) -> io:: Result < FileAttr > {
115- let guard = self . inner . read ( ) . await ;
116- Ok ( guard. attr )
116+ Ok ( * self . inner . attr . read ( ) . await )
117117 }
118118}
119119
120120impl RomFileInterface {
121- pub fn new ( inner : Arc < RwLock < RomFileInner > > ) -> Self {
121+ pub fn new ( inner : Arc < RomFileInner > ) -> Self {
122122 Self {
123123 pos : Mutex :: new ( 0 ) ,
124124 inner,
125125 }
126126 }
127127
128128 pub fn len ( & self ) -> usize {
129- block_on ( async { Ok ( self . inner . read ( ) . await . data . len ( ) ) } , None ) . unwrap ( )
129+ self . inner . data . len ( )
130130 }
131131}
132132
@@ -280,7 +280,7 @@ impl RamFileInterface {
280280
281281#[ derive( Debug ) ]
282282pub ( crate ) struct RomFile {
283- data : Arc < RwLock < RomFileInner > > ,
283+ data : Arc < RomFileInner > ,
284284}
285285
286286impl VfsNode for RomFile {
@@ -295,7 +295,7 @@ impl VfsNode for RomFile {
295295 }
296296
297297 fn get_file_attributes ( & self ) -> io:: Result < FileAttr > {
298- block_on ( async { Ok ( self . data . read ( ) . await . attr ) } , None )
298+ block_on ( async { Ok ( * self . data . attr . read ( ) . await ) } , None )
299299 }
300300
301301 fn traverse_lstat ( & self , components : & mut Vec < & str > ) -> io:: Result < FileAttr > {
@@ -329,7 +329,7 @@ impl RomFile {
329329 } ;
330330
331331 Self {
332- data : Arc :: new ( RwLock :: new ( RomFileInner :: new ( data, attr) ) ) ,
332+ data : Arc :: new ( RomFileInner :: new ( data, attr) ) ,
333333 }
334334 }
335335}
0 commit comments