1use std::collections::VecDeque;
2use std::future::Future;
3use std::pin::Pin;
4
5use crate::scheduler::Scheduler;
6
7pub struct SchedulerBench {
8 scheduler: Scheduler,
9}
10
11impl Default for SchedulerBench {
12 fn default() -> Self {
13 Self::new()
14 }
15}
16
17impl SchedulerBench {
18 pub fn new() -> Self {
19 Self {
20 scheduler: Scheduler::new(),
21 }
22 }
23
24 pub fn fill_pending(&mut self, count: usize) {
25 self.scheduler.pending_new.clear();
26 for id in 0..count {
27 let fut: Pin<Box<dyn Future<Output = ()> + Send + 'static>> = Box::pin(async move {
28 let _ = id;
29 });
30 self.scheduler.pending_new.push((id, fut));
31 }
32 }
33
34 pub fn drain_pending_into_ready(&mut self) {
35 for (id, fut) in self.scheduler.pending_new.drain(..).collect::<Vec<_>>() {
36 self.scheduler.tasks.insert(id, fut);
37 self.scheduler.ready.push_back(id);
38 }
39 }
40
41 pub fn load_ready(&mut self, count: usize) {
42 self.scheduler.ready = (0..count).collect::<VecDeque<_>>();
43 }
44
45 pub fn churn_ready(&mut self, iterations: usize) {
46 for _ in 0..iterations {
47 if let Some(id) = self.scheduler.ready.pop_front() {
48 self.scheduler.ready.push_back(id);
49 }
50 }
51 }
52}