From 0c3ece6fdcfc0b75ba16f9b4c623c181fec1425b Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sat, 4 May 2024 23:29:42 +0800 Subject: [PATCH] feat: switch to new linked_list --- kernel/src/objects/cap.rs | 36 ++++++++++-------------------------- kernel/src/objects/mod.rs | 13 +++++-------- 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/kernel/src/objects/cap.rs b/kernel/src/objects/cap.rs index 1180d34..0052667 100644 --- a/kernel/src/objects/cap.rs +++ b/kernel/src/objects/cap.rs @@ -1,6 +1,10 @@ use crate::objects::null::NullCap; use api::cap::ObjectType; -use core::{cell::Cell, ptr::NonNull}; +use core::cell::Cell; +use utils::{ + linked_list::{Link, LinkHelper}, + LinkHelperImpl, +}; use vspace::addr::PhysAddr; /// RawCap is the specific implementation of capability which stores in CNode @@ -31,47 +35,27 @@ impl RawCap { } } -#[derive(Copy, Clone, Default)] -pub struct Link { - pub prev: Option>, - pub next: Option>, -} - #[derive(Clone)] pub struct CapEntry { pub cap: Cell, - pub link: Cell, + pub link: Link, } +LinkHelperImpl!(CapEntry: link); + const_assert_eq!(core::mem::size_of::(), ObjectType::CNode.size(0)); impl CapEntry { pub fn new(cap: RawCap) -> Self { Self { cap: Cell::new(cap), - link: Cell::new(Link::default()), + link: Link::default(), } } pub fn init(&mut self) { self.cap = Cell::new(NullCap::mint()); - self.link = Cell::new(Link::default()); - } - - pub fn prev(&self) -> Option> { - self.link.get().prev - } - - pub fn next(&self) -> Option> { - self.link.get().next - } - - pub fn set_prev(&mut self, prev: Option>) { - self.link.get_mut().prev = prev; - } - - pub fn set_next(&mut self, next: Option>) { - self.link.get_mut().next = next; + self.link = Link::default(); } } diff --git a/kernel/src/objects/mod.rs b/kernel/src/objects/mod.rs index c870308..cc518e4 100644 --- a/kernel/src/objects/mod.rs +++ b/kernel/src/objects/mod.rs @@ -51,25 +51,22 @@ impl<'a, T: KernelObject + ?Sized> TryFrom<&'a CapEntry> for Cap<'a, T> { impl<'a, T: KernelObject + ?Sized> Cap<'a, T> { pub fn append(&mut self, new: &mut CapEntry) { - let next = self.cte.next(); + let next = self.cte.link.next(); // update new cap's link - new.set_prev(Some(NonNull::from(self.cte))); - new.set_next(next); + new.link.set_prev(Some(NonNull::from(self.cte))); + new.link.set_next(next); // record new cap's addr let new_addr = Some(NonNull::from(new)); // update next cap's link.prev if let Some(mut next) = next { - unsafe { next.as_mut().set_prev(new_addr) }; + unsafe { next.as_mut().link.set_prev(new_addr) }; } // update self's link.next - self.cte.link.update(|mut link| { - link.next = new_addr; - link - }); + self.cte.link.next.set(new_addr); } }