Downgrade locks to read
This commit is contained in:
@@ -1004,7 +1004,7 @@ pub fn bulk_add_fds(
|
||||
return Ok(0);
|
||||
}
|
||||
let current_lock = context::current();
|
||||
let mut current = current_lock.write(token.token());
|
||||
let mut current = current_lock.read(token.token());
|
||||
let (current, mut token) = current.token_split();
|
||||
|
||||
let files: Vec<FileDescriptor> = descriptions
|
||||
@@ -1048,7 +1048,7 @@ pub fn bulk_insert_fds(
|
||||
.read_usize()?;
|
||||
|
||||
let current_lock = context::current();
|
||||
let mut current = current_lock.write(token.token());
|
||||
let mut current = current_lock.read(token.token());
|
||||
let (current, mut token) = current.token_split();
|
||||
|
||||
if first_fd == usize::MAX {
|
||||
|
||||
@@ -65,7 +65,7 @@ impl UnmapResult {
|
||||
};
|
||||
|
||||
let (scheme_id, number) = {
|
||||
let desc = description.write(token.token());
|
||||
let desc = description.read(token.token());
|
||||
(desc.scheme, desc.number)
|
||||
};
|
||||
|
||||
|
||||
+2
-2
@@ -181,8 +181,8 @@ impl KernelScheme for AcpiScheme {
|
||||
Ok(OpenResult::SchemeLocal(fd, int_flags))
|
||||
}
|
||||
fn fsize(&self, id: usize, token: &mut CleanLockToken) -> Result<u64> {
|
||||
let mut handles = HANDLES.write(token.token());
|
||||
let handle = handles.get_mut(id)?;
|
||||
let mut handles = HANDLES.read(token.token());
|
||||
let handle = handles.get(id)?;
|
||||
|
||||
if handle.stat {
|
||||
return Err(Error::new(EBADF));
|
||||
|
||||
+6
-6
@@ -633,8 +633,8 @@ impl KernelScheme for ProcScheme {
|
||||
) -> Result<usize> {
|
||||
// TODO: simplify
|
||||
let handle = {
|
||||
let mut handles = HANDLES.write(token.token());
|
||||
let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||
let mut handles = HANDLES.read(token.token());
|
||||
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||
handle.clone()
|
||||
};
|
||||
|
||||
@@ -667,8 +667,8 @@ impl KernelScheme for ProcScheme {
|
||||
|
||||
// Don't hold a global lock during the context switch later on
|
||||
let handle = {
|
||||
let mut handles = HANDLES.write(token.token());
|
||||
let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||
let mut handles = HANDLES.read(token.token());
|
||||
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||
handle.clone()
|
||||
};
|
||||
|
||||
@@ -696,8 +696,8 @@ impl KernelScheme for ProcScheme {
|
||||
}
|
||||
|
||||
fn fsize(&self, id: usize, token: &mut CleanLockToken) -> Result<u64> {
|
||||
let mut handles = HANDLES.write(token.token());
|
||||
let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?;
|
||||
let mut handles = HANDLES.read(token.token());
|
||||
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;
|
||||
|
||||
handle.fsize()
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ impl KernelScheme for SysScheme {
|
||||
if matches!(kind, Kind::Wr(_)) {
|
||||
return Ok(0);
|
||||
}
|
||||
let is_data_none = data_lock.write(token.token()).is_none();
|
||||
let is_data_none = data_lock.read(token.token()).is_none();
|
||||
if is_data_none {
|
||||
let new_data = kind.generate_data(token)?;
|
||||
let mut data_guard = data_lock.write(token.token());
|
||||
@@ -218,7 +218,7 @@ impl KernelScheme for SysScheme {
|
||||
_ => return Err(Error::new(EBADF)),
|
||||
}
|
||||
};
|
||||
let is_data_none = data_lock.write(token.token()).is_none();
|
||||
let is_data_none = data_lock.read(token.token()).is_none();
|
||||
if is_data_none {
|
||||
let new_data = kind.generate_data(token)?;
|
||||
let mut data_guard = data_lock.write(token.token());
|
||||
@@ -296,7 +296,7 @@ impl KernelScheme for SysScheme {
|
||||
}
|
||||
};
|
||||
let stat = if let Some((kind, data_lock)) = stat_base {
|
||||
let is_data_none = data_lock.write(token.token()).is_none();
|
||||
let is_data_none = data_lock.read(token.token()).is_none();
|
||||
if is_data_none {
|
||||
let new_data = kind.generate_data(token)?;
|
||||
let mut data_guard = data_lock.write(token.token());
|
||||
|
||||
+1
-1
@@ -441,7 +441,7 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize, token: &mut CleanLockToken)
|
||||
.ok_or(Error::new(EBADF))?;
|
||||
|
||||
let (scheme_id, number, flags) = {
|
||||
let desc = file.description.write(token.token());
|
||||
let desc = file.description.read(token.token());
|
||||
(desc.scheme, desc.number, desc.flags)
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user