From 054c64542ba10604bd7ee2c6cf0351cfcaea5498 Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Mon, 2 Sep 2024 22:01:19 +0800 Subject: [PATCH] Use `PollAdaptor` to signal `SIGIO` --- kernel/src/fs/file_table.rs | 53 ++++++++++---------------------- kernel/src/process/signal/mod.rs | 2 +- 2 files changed, 18 insertions(+), 37 deletions(-) diff --git a/kernel/src/fs/file_table.rs b/kernel/src/fs/file_table.rs index 678dc230b..1acab616c 100644 --- a/kernel/src/fs/file_table.rs +++ b/kernel/src/fs/file_table.rs @@ -18,7 +18,7 @@ use crate::{ net::socket::Socket, prelude::*, process::{ - signal::{constants::SIGIO, signals::kernel::KernelSignal}, + signal::{constants::SIGIO, signals::kernel::KernelSignal, PollAdaptor}, Pid, Process, }, }; @@ -284,30 +284,20 @@ impl FileTableEntry { /// for I/O events on the file descriptor, if `O_ASYNC` status flag is set /// on this file. pub fn set_owner(&mut self, owner: Option<&Arc>) -> Result<()> { - match owner { - None => { - // Unset the owner if the given pid is zero - if let Some((_, observer)) = self.owner.as_ref() { - let _ = self.file.unregister_observer(&Arc::downgrade(observer)); - } - let _ = self.owner.take(); - } - Some(owner_process) => { - let owner_pid = owner_process.pid(); - if let Some((pid, observer)) = self.owner.as_ref() { - if *pid == owner_pid { - return Ok(()); - } + let Some(process) = owner else { + self.owner = None; + return Ok(()); + }; - let _ = self.file.unregister_observer(&Arc::downgrade(observer)); - } + let mut poller = PollAdaptor::with_observer(OwnerObserver::new( + self.file.clone(), + Arc::downgrade(process), + )); + self.file + .poll(IoEvents::IN | IoEvents::OUT, Some(poller.as_handle_mut())); + + self.owner = Some((process.pid(), poller)); - let observer = OwnerObserver::new(self.file.clone(), Arc::downgrade(owner_process)); - self.file - .register_observer(observer.weak_self(), IoEvents::empty())?; - let _ = self.owner.insert((owner_pid, observer)); - } - } Ok(()) } @@ -342,7 +332,7 @@ impl Clone for FileTableEntry { file: self.file.clone(), flags: AtomicU8::new(self.flags.load(Ordering::Relaxed)), subject: Subject::new(), - owner: self.owner.clone(), + owner: None, } } } @@ -354,25 +344,16 @@ bitflags! { } } -type Owner = (Pid, Arc>); +type Owner = (Pid, PollAdaptor); struct OwnerObserver { file: Arc, owner: Weak, - weak_self: Weak, } impl OwnerObserver { - pub fn new(file: Arc, owner: Weak) -> Arc { - Arc::new_cyclic(|weak_ref| Self { - file, - owner, - weak_self: weak_ref.clone(), - }) - } - - pub fn weak_self(&self) -> Weak { - self.weak_self.clone() + pub fn new(file: Arc, owner: Weak) -> Self { + Self { file, owner } } } diff --git a/kernel/src/process/signal/mod.rs b/kernel/src/process/signal/mod.rs index 8099a46c6..5cbe36d04 100644 --- a/kernel/src/process/signal/mod.rs +++ b/kernel/src/process/signal/mod.rs @@ -20,7 +20,7 @@ use c_types::{siginfo_t, ucontext_t}; pub use events::{SigEvents, SigEventsFilter}; use ostd::{cpu::UserContext, user::UserContextApi}; pub use pause::{with_signal_blocked, Pause}; -pub use poll::{PollHandle, Pollable, Pollee, Poller}; +pub use poll::{PollAdaptor, PollHandle, Pollable, Pollee, Poller}; use sig_action::{SigAction, SigActionFlags, SigDefaultAction}; use sig_mask::SigMask; use sig_num::SigNum;