From ff11f47404d895d9062c6038e1940482dbe28535 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 13 May 2026 10:46:38 +0700 Subject: [PATCH] Add futex, pipe, timeout subscribers --- src/context/timeout.rs | 4 ++++ src/scheme/pipe.rs | 4 ++++ src/scheme/sys/stat.rs | 11 +++++++++-- src/scheme/user.rs | 2 +- src/syscall/futex.rs | 11 +++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/context/timeout.rs b/src/context/timeout.rs index dbf5de8efc..5191a35792 100644 --- a/src/context/timeout.rs +++ b/src/context/timeout.rs @@ -28,6 +28,10 @@ fn registry(token: LockToken<'_, L0>) -> MutexGuard<'_, L1, Registry> { REGISTRY.lock(token) } +pub fn get_timeout_stat(token: &mut CleanLockToken) -> usize { + REGISTRY.lock(token.token()).len() +} + pub fn register( scheme_id: SchemeId, event_id: usize, diff --git a/src/scheme/pipe.rs b/src/scheme/pipe.rs index df5db9d908..44e303d878 100644 --- a/src/scheme/pipe.rs +++ b/src/scheme/pipe.rs @@ -65,6 +65,10 @@ pub fn pipe(token: &mut CleanLockToken) -> Result<(usize, usize)> { Ok((id, id | WRITE_NOT_READ_BIT)) } +pub fn get_pipe_stat(token: &mut CleanLockToken) -> usize { + PIPES.read(token.token()).len() +} + pub struct PipeScheme; impl PipeScheme { diff --git a/src/scheme/sys/stat.rs b/src/scheme/sys/stat.rs index b583a398d9..0f87db8079 100644 --- a/src/scheme/sys/stat.rs +++ b/src/scheme/sys/stat.rs @@ -6,7 +6,7 @@ use crate::{ event::get_event_stat, percpu::get_all_stats, sync::CleanLockToken, - syscall::error::Result, + syscall::{error::Result, futex::get_futex_stat}, time::START, }; use alloc::{string::String, vec::Vec}; @@ -17,6 +17,9 @@ pub fn resource(token: &mut CleanLockToken) -> Result> { let (contexts_alive, contexts_running, contexts_blocked) = get_contexts_stats(token); let (event_keys, event_subs) = get_event_stat(token); + let (futex_keys, futex_subs) = get_futex_stat(token); + let pipe_subs = crate::scheme::pipe::get_pipe_stat(token); + let timeout_subs = crate::context::timeout::get_timeout_stat(token); let res = format!( "{}{}\n\ boot_time: {start_time_sec}\n\ @@ -26,7 +29,11 @@ pub fn resource(token: &mut CleanLockToken) -> Result> { contexts_running: {contexts_running}\n\ contexts_blocked: {contexts_blocked}\n\ event_registries: {event_keys}\n\ - event_subcribers: {event_subs}\n", + event_subcribers: {event_subs}\n\ + futex_registries: {futex_keys}\n\ + futex_subcribers: {futex_subs}\n\ + pipe_subcribers: {pipe_subs}\n\ + timeout_subscribers: {timeout_subs}\n", get_cpu_stats(), get_irq_stats(), get_context_switch_count(), diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 5671e3007f..ece62d57e3 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -21,7 +21,7 @@ use crate::{ file::{FileDescription, FileDescriptor, InternalFlags, LockedFileDescription}, memory::{ AddrSpace, AddrSpaceWrapper, BorrowedFmapSource, Grant, GrantFileRef, MmapMode, - PageSpan, UnmapResult, UnmapVec, DANGLING, + PageSpan, UnmapVec, DANGLING, }, BorrowedHtBuf, ContextLock, PreemptGuard, PreemptGuardL1, Status, }, diff --git a/src/syscall/futex.rs b/src/syscall/futex.rs index 4c187b8ec8..847cd141a6 100644 --- a/src/syscall/futex.rs +++ b/src/syscall/futex.rs @@ -52,6 +52,17 @@ pub struct FutexEntry { static FUTEXES: Mutex = Mutex::new(FutexList::with_hasher(DefaultHashBuilder::new())); +pub fn get_futex_stat(token: &mut CleanLockToken) -> (usize, usize) { + let mut regc = 0; + let mut regl = 0; + let registry = FUTEXES.lock(token.token()); + for (k, v) in registry.iter() { + regl += v.len(); + regc += 1; + } + (regc, regl) +} + fn validate_and_translate_virt(space: &AddrSpace, addr: VirtualAddress) -> Option { // TODO: Move this elsewhere! if addr.data().saturating_add(size_of::()) >= crate::USER_END_OFFSET {