diff options
Diffstat (limited to 'src/core_selector.rs')
-rw-r--r-- | src/core_selector.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/core_selector.rs b/src/core_selector.rs new file mode 100644 index 0000000..f70b252 --- /dev/null +++ b/src/core_selector.rs @@ -0,0 +1,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 + } +} |