37 lines
1.0 KiB
Rust
37 lines
1.0 KiB
Rust
use std::rc::{Rc, Weak};
|
|
use std::cell::RefCell;
|
|
use r9_macro::SharedFromSelf;
|
|
use r9_macro_derive::SharedFromSelf;
|
|
|
|
#[derive(SharedFromSelf)]
|
|
pub struct Queue<T> {
|
|
msg_list: Rc::<RefCell::<crate::ListHead<T>>>,
|
|
pub work_list: Rc::<RefCell::<crate::ListHead<T>>>,
|
|
_self_wp: Weak::<RefCell::<Self>>,
|
|
}
|
|
|
|
impl<T> Queue<T> {
|
|
|
|
pub fn new() -> Rc::<RefCell::<Self>> {
|
|
let this = Rc::new(RefCell::new(Self{
|
|
msg_list: crate::ListHead::<T>::new_head(),
|
|
work_list: crate::ListHead::<T>::new_head(),
|
|
_self_wp: Default::default(),
|
|
}));
|
|
this.borrow_mut()._self_wp = Rc::downgrade(&this);
|
|
return this;
|
|
}
|
|
|
|
pub fn push(&self, node: &Rc::<RefCell::<crate::ListHead<T>>>) {
|
|
crate::ListHead::<T>::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);
|
|
}
|
|
}
|
|
|
|
}
|