Explicitly scope all locks, fixing multi_core hangs. Allow contexts on any CPU

This commit is contained in:
Jeremy Soller
2025-09-13 10:10:07 -06:00
parent da6f7adb42
commit 8a2aa411e2
6 changed files with 300 additions and 263 deletions
+17 -11
View File
@@ -28,11 +28,14 @@ pub fn file_op_generic_ext<T>(
fd: FileHandle,
op: impl FnOnce(&dyn KernelScheme, Arc<RwLock<FileDescription>>, FileDescription) -> Result<T>,
) -> Result<T> {
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
let desc = *file.description.read();
let (file, desc) = {
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
let desc = *file.description.read();
(file, desc)
};
let scheme = scheme::schemes()
.get(desc.scheme)
@@ -239,11 +242,14 @@ pub fn close(fd: FileHandle) -> Result<()> {
}
fn duplicate_file(fd: FileHandle, user_buf: UserSliceRo) -> Result<FileDescriptor> {
let caller_ctx = context::current().read().caller_ctx();
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
let (caller_ctx, file) = {
let context_lock = context::current();
let context = context_lock.read();
(
context.caller_ctx(),
context.get_file(fd).ok_or(Error::new(EBADF))?,
)
};
if user_buf.is_empty() {
Ok(FileDescriptor {
@@ -251,7 +257,7 @@ fn duplicate_file(fd: FileHandle, user_buf: UserSliceRo) -> Result<FileDescripto
cloexec: false,
})
} else {
let description = file.description.read();
let description = { *file.description.read() };
let new_description = {
let scheme = scheme::schemes()
+3 -1
View File
@@ -56,7 +56,9 @@ pub fn exit_this_context(excp: Option<syscall::Exception>) -> ! {
EventFlags::EVENT_READ,
);
}
let _ = context::contexts_mut().remove(&ContextRef(context_lock));
{
let _ = context::contexts_mut().remove(&ContextRef(context_lock));
}
context::switch();
unreachable!();
}