blob: f70b25268d69a6966b7556f99464a59e7936d4d6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
use std::ops::Range;
pub trait CoreSelector {
fn next_core(&mut self, previous_cpu: i32) -> i32;
}
pub struct RoundRobinSelector {
offset: u32,
num_cores: u32,
last_used: u32,
}
impl RoundRobinSelector {
pub fn new(cores: &Range<i32>) -> RoundRobinSelector {
Self {
offset: cores.start as u32,
num_cores: cores.len() as u32,
last_used: 0,
}
}
}
impl CoreSelector for RoundRobinSelector {
fn next_core(&mut self, previous_cpu: i32) -> i32 {
if (self.offset..(self.offset + self.num_cores)).contains(&(previous_cpu as u32)) {
return previous_cpu;
}
self.last_used += 1;
(self.offset + (self.last_used % self.num_cores.max(1))) as i32
}
}
|