From 9761c32056dea6fb975baed7b076d34d25b34d00 Mon Sep 17 00:00:00 2001 From: azw Date: Thu, 9 Nov 2023 00:19:56 +0000 Subject: [PATCH] 1 --- r9/src/lib.rs | 2 ++ r9/src/queue.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 r9/src/queue.rs diff --git a/r9/src/lib.rs b/r9/src/lib.rs index 4bc4ac0..3fced15 100644 --- a/r9/src/lib.rs +++ b/r9/src/lib.rs @@ -1,5 +1,7 @@ pub mod xtimer; pub mod listhead; +pub mod queue; pub use xtimer::XTimer; pub use listhead::ListHead; +pub use queue::Queue; diff --git a/r9/src/queue.rs b/r9/src/queue.rs new file mode 100644 index 0000000..957c340 --- /dev/null +++ b/r9/src/queue.rs @@ -0,0 +1,36 @@ +use std::rc::{Rc, Weak}; +use std::cell::RefCell; +use r9_macro::SharedFromSelf; +use r9_macro_derive::SharedFromSelf; + +#[derive(SharedFromSelf)] +pub struct Queue { + msg_list: Rc::>>, + pub work_list: Rc::>>, + _self_wp: Weak::>, +} + +impl Queue { + + pub fn new() -> Rc::> { + let this = Rc::new(RefCell::new(Self{ + msg_list: crate::ListHead::::new_head(), + work_list: crate::ListHead::::new_head(), + _self_wp: Default::default(), + })); + this.borrow_mut()._self_wp = Rc::downgrade(&this); + return this; + } + + pub fn push(&mut self, node: &Rc::>>) { + crate::ListHead::::add_tail(&self.msg_list, node); + } + + pub fn fetch(&mut self) { + if !self.msg_list.borrow().empty() && + self.work_list.borrow().empty() { + crate::ListHead::replace_init(&self.work_list, &self.msg_list); + } + } + +}