fix something

This commit is contained in:
hustccc 2021-03-07 02:14:05 +09:00
parent ee2c007cbe
commit 5006079b9d
3 changed files with 43 additions and 23 deletions

View File

@ -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)
}
}
}

View File

@ -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()
}
} }

View File

@ -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;