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() })
|
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 super::{Scheduler, ScheduledItem};
|
||||||
use alloc::collections::LinkedList;
|
use super::ring_fifo_scheduler::RingQueue;
|
||||||
|
|
||||||
/// 尽量调度相同地址空间的调度器
|
/// 尽量调度相同地址空间的调度器
|
||||||
pub struct SameAddrSpaceScheduler<T, const N: usize> {
|
pub struct SameAddrSpaceScheduler<T, const N: usize> {
|
||||||
tasks: LinkedList<T>,
|
tasks: RingQueue<T, N>,
|
||||||
max_len: usize
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, const N: usize> SameAddrSpaceScheduler<T, N> {
|
impl<T, const N: usize> SameAddrSpaceScheduler<T, N> {
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub const fn new() -> Self {
|
pub const fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
tasks: LinkedList::new(),
|
tasks: RingQueue::new(),
|
||||||
max_len: N
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,13 +23,8 @@ impl<T, const N: usize> Scheduler<T> for SameAddrSpaceScheduler<T, N>
|
||||||
/// 添加任务到调度队列
|
/// 添加任务到调度队列
|
||||||
/// 如果队列已满,返回 Some(task)
|
/// 如果队列已满,返回 Some(task)
|
||||||
fn add_task(&mut self, task: T) -> Option<T> {
|
fn add_task(&mut self, task: T) -> Option<T> {
|
||||||
if self.tasks.len() < self.max_len {
|
// 加入环形队列
|
||||||
// 加入链表尾部
|
self.tasks.push_back(task)
|
||||||
self.tasks.push_back(task);
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(task)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/// 取出下一个当前地址空间的任务
|
/// 取出下一个当前地址空间的任务
|
||||||
/// 如果当前地址空间的任务或者所有任务已经完成,返回 None
|
/// 如果当前地址空间的任务或者所有任务已经完成,返回 None
|
||||||
|
@ -70,19 +63,10 @@ impl<T, const N: usize> Scheduler<T> for SameAddrSpaceScheduler<T, N>
|
||||||
}
|
}
|
||||||
fn remove_task(&mut self, task: &T) {
|
fn remove_task(&mut self, task: &T) {
|
||||||
// 移除相应的线程并且确认恰移除一个线程
|
// 移除相应的线程并且确认恰移除一个线程
|
||||||
let mut removed = self.tasks.drain_filter(|t| t == task);
|
drop(task);
|
||||||
assert!(removed.next().is_some() && removed.next().is_none());
|
todo!()
|
||||||
}
|
}
|
||||||
fn set_priority(&mut self, _task: T, _prio: Self::Priority) {
|
fn set_priority(&mut self, _task: T, _prio: Self::Priority) {
|
||||||
todo!()
|
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(global_asm, llvm_asm, asm, alloc_error_handler)]
|
||||||
#![feature(drain_filter)]
|
#![feature(drain_filter)]
|
||||||
#![feature(maybe_uninit_uninit_array)]
|
#![feature(maybe_uninit_uninit_array)]
|
||||||
|
#![feature(maybe_uninit_ref)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
Loading…
Reference in New Issue