summaryrefslogtreecommitdiff
path: root/src/core_selector.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/core_selector.rs')
-rw-r--r--src/core_selector.rs31
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
+ }
+}