fix something
This commit is contained in:
parent
ee2c007cbe
commit
5006079b9d
|
@ -96,4 +96,39 @@ impl<T, const N: usize> RingQueue<T, N> {
|
|||
Some(unsafe { &*self.elem[self.front].as_ptr() })
|
||||
}
|
||||
}
|
||||
pub fn iter(&self) -> Iter<'_, T, N> {
|
||||
let mut elem = [&self.elem[0]; N];
|
||||
for i in 0..self.elem.len() {
|
||||
elem[i] = &self.elem[i];
|
||||
}
|
||||
Iter {
|
||||
elem,
|
||||
front: self.front,
|
||||
tail: self.tail
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Iter<'a, T: 'a, const N: usize> {
|
||||
elem: [&'a MaybeUninit<T>; N],
|
||||
front: usize,
|
||||
tail: usize
|
||||
}
|
||||
|
||||
// TODO: 这里有不确定 Unsafe 代码,需检查正确性
|
||||
impl<'a, T, const N: usize> Iterator for Iter<'a, T, N> {
|
||||
type Item = &'a T;
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
if self.tail == self.front {
|
||||
// is empty
|
||||
None
|
||||
} else {
|
||||
let value = unsafe { self.elem[self.front].assume_init_ref() };
|
||||
self.front = self.front.wrapping_add(1);
|
||||
if self.front > N || self.front == 0 {
|
||||
self.front = self.front.wrapping_sub(N);
|
||||
}
|
||||
Some(value)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,18 +1,16 @@
|
|||
use super::{Scheduler, ScheduledItem};
|
||||
use alloc::collections::LinkedList;
|
||||
use super::ring_fifo_scheduler::RingQueue;
|
||||
|
||||
/// 尽量调度相同地址空间的调度器
|
||||
pub struct SameAddrSpaceScheduler<T, const N: usize> {
|
||||
tasks: LinkedList<T>,
|
||||
max_len: usize
|
||||
tasks: RingQueue<T, N>,
|
||||
}
|
||||
|
||||
impl<T, const N: usize> SameAddrSpaceScheduler<T, N> {
|
||||
#[allow(unused)]
|
||||
pub const fn new() -> Self {
|
||||
Self {
|
||||
tasks: LinkedList::new(),
|
||||
max_len: N
|
||||
tasks: RingQueue::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,13 +23,8 @@ impl<T, const N: usize> Scheduler<T> for SameAddrSpaceScheduler<T, N>
|
|||
/// 添加任务到调度队列
|
||||
/// 如果队列已满,返回 Some(task)
|
||||
fn add_task(&mut self, task: T) -> Option<T> {
|
||||
if self.tasks.len() < self.max_len {
|
||||
// 加入链表尾部
|
||||
self.tasks.push_back(task);
|
||||
None
|
||||
} else {
|
||||
Some(task)
|
||||
}
|
||||
// 加入环形队列
|
||||
self.tasks.push_back(task)
|
||||
}
|
||||
/// 取出下一个当前地址空间的任务
|
||||
/// 如果当前地址空间的任务或者所有任务已经完成,返回 None
|
||||
|
@ -70,19 +63,10 @@ impl<T, const N: usize> Scheduler<T> for SameAddrSpaceScheduler<T, N>
|
|||
}
|
||||
fn remove_task(&mut self, task: &T) {
|
||||
// 移除相应的线程并且确认恰移除一个线程
|
||||
let mut removed = self.tasks.drain_filter(|t| t == task);
|
||||
assert!(removed.next().is_some() && removed.next().is_none());
|
||||
drop(task);
|
||||
todo!()
|
||||
}
|
||||
fn set_priority(&mut self, _task: T, _prio: Self::Priority) {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, const N: usize> IntoIterator for SameAddrSpaceScheduler<T, N> {
|
||||
type Item = T;
|
||||
type IntoIter = alloc::collections::linked_list::IntoIter<Self::Item>;
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
self.tasks.into_iter()
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
#![feature(global_asm, llvm_asm, asm, alloc_error_handler)]
|
||||
#![feature(drain_filter)]
|
||||
#![feature(maybe_uninit_uninit_array)]
|
||||
#![feature(maybe_uninit_ref)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate alloc;
|
||||
|
|
Loading…
Reference in New Issue