Skip to content

Commit 1a190c7

Browse files
committed
linux: Initial support for cpuset and gnu pthread_attr_affinity interface
1 parent e9db959 commit 1a190c7

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

src/unix/notbsd/linux/mips.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,4 +494,10 @@ extern {
494494
flags: ::c_int) -> ::c_int;
495495
pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int;
496496
pub fn ptrace(request: ::c_uint, ...) -> ::c_long;
497+
pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t,
498+
cpusetsize: ::size_t,
499+
cpuset: *mut ::cpu_set_t) -> ::c_int;
500+
pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t,
501+
cpusetsize: ::size_t,
502+
cpuset: *const ::cpu_set_t) -> ::c_int;
497503
}

src/unix/notbsd/linux/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! Linux-specific definitions for linux-like values
22
3+
use dox::mem;
4+
35
pub type useconds_t = u32;
46
pub type dev_t = u64;
57
pub type socklen_t = u32;
@@ -185,6 +187,31 @@ s! {
185187
}
186188
}
187189

190+
f! {
191+
pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () {
192+
for slot in cpuset.bits.iter_mut() {
193+
*slot = 0;
194+
}
195+
}
196+
197+
pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () {
198+
let size = mem::size_of_val(&cpuset.bits[0]);
199+
let (idx, offset) = (cpu / size, cpu % size);
200+
cpuset.bits[idx] |= 1 << offset;
201+
()
202+
}
203+
204+
pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool {
205+
let size = mem::size_of_val(&cpuset.bits[0]);
206+
let (idx, offset) = (cpu / size, cpu % size);
207+
0 != (cpuset.bits[idx] & (1 << offset))
208+
}
209+
210+
pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool {
211+
set1.bits == set2.bits
212+
}
213+
}
214+
188215
pub const FILENAME_MAX: ::c_uint = 4096;
189216
pub const L_tmpnam: ::c_uint = 20;
190217
pub const _PC_NAME_MAX: ::c_int = 3;

src/unix/notbsd/linux/other/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,12 @@ extern {
434434
flags: ::c_int) -> ::c_int;
435435
pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int;
436436
pub fn ptrace(request: ::c_uint, ...) -> ::c_long;
437+
pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t,
438+
cpusetsize: ::size_t,
439+
cpuset: *mut ::cpu_set_t) -> ::c_int;
440+
pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t,
441+
cpusetsize: ::size_t,
442+
cpuset: *const ::cpu_set_t) -> ::c_int;
437443
}
438444

439445
cfg_if! {

0 commit comments

Comments
 (0)