summaryrefslogtreecommitdiff
path: root/src/core_selector.rs
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
    }
}