Skip to content

Commit 2e98e02

Browse files
committed
refactor(fs/mem): Use more fine-grained locking for RomFile's
1 parent 4712cd2 commit 2e98e02

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

src/fs/mem.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ use crate::{arch, io};
3333
#[derive(Debug)]
3434
pub(crate) struct RomFileInner {
3535
pub data: &'static [u8],
36-
pub attr: FileAttr,
36+
pub attr: RwLock<FileAttr>,
3737
}
3838

3939
impl 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]
5353
impl 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

120117
impl 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)]
282279
pub(crate) struct RomFile {
283-
data: Arc<RwLock<RomFileInner>>,
280+
data: Arc<RomFileInner>,
284281
}
285282

286283
impl 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

Comments
 (0)