1use ccp_core_affinity::CoreId;
18
19use crate::LogicalCoreId;
20
21pub const DEFAULT: DefaultThreadPinner = DefaultThreadPinner {};
22
23#[cfg_attr(feature = "mockall", mockall::automock)]
24pub trait ThreadPinner: Send + Sync {
25 fn pin_current_thread_to(&self, core_id: LogicalCoreId) -> bool;
26
27 fn pin_current_thread_to_cpuset(&self, core_ids: &[LogicalCoreId]) -> bool;
28}
29
30pub struct DefaultThreadPinner;
31
32impl ThreadPinner for DefaultThreadPinner {
33 #[inline]
34 fn pin_current_thread_to(&self, core_id: LogicalCoreId) -> bool {
35 let core_id = CoreId { id: core_id.into() };
36 ccp_core_affinity::set_for_current(core_id)
37 }
38
39 #[inline]
40 fn pin_current_thread_to_cpuset(&self, core_ids: &[LogicalCoreId]) -> bool {
41 let core_ids = core_ids
42 .iter()
43 .map(|core_id| {
44 let id = (*core_id).into();
45 CoreId { id }
46 })
47 .collect::<Vec<_>>();
48
49 ccp_core_affinity::set_mask_for_current(&core_ids)
50 }
51}