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(&self, node: &Rc::>>) { crate::ListHead::::add_tail(&self.msg_list, node); } pub fn fetch(&self) { if !self.msg_list.borrow().empty() && self.work_list.borrow().empty() { crate::ListHead::replace_init(&self.work_list, &self.msg_list); } } }