summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Triplett <josh@joshtriplett.org>2021-10-21 13:12:30 +0200
committerJosh Triplett <josh@joshtriplett.org>2021-10-21 13:12:30 +0200
commit59eb75918ff0dfa3702fcc03261d3baae18dd127 (patch)
treefa2ea384197ec10360ad7d6568428c701c1190e9
parent7dd79325906a295d60ea5ef3d2fed80edb026388 (diff)
downloadrust-libc-59eb75918ff0dfa3702fcc03261d3baae18dd127.tar.gz
Add missing CPU_* macros to android, and sync with Linux
Linux had the full set of CPU_* macros, but Android missed a few. Add the missing ones: CPU_ALLOC_SIZE, CPU_COUNT_S, and CPU_COUNT. Sync the definitions more closely with the Linux versions, so that they're easier to keep in sync. The only differences now are the field name: bits for Linux vs __bits for Android.
-rw-r--r--src/unix/linux_like/android/mod.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/unix/linux_like/android/mod.rs b/src/unix/linux_like/android/mod.rs
index 6faadb9b88..0ef9a203f7 100644
--- a/src/unix/linux_like/android/mod.rs
+++ b/src/unix/linux_like/android/mod.rs
@@ -2480,6 +2480,12 @@ f! {
}
}
+ pub fn CPU_ALLOC_SIZE(count: ::c_int) -> ::size_t {
+ let _dummy: cpu_set_t = ::mem::zeroed();
+ let size_in_bits = 8 * ::mem::size_of_val(&_dummy.__bits[0]);
+ ((count as ::size_t + size_in_bits - 1) / 8) as ::size_t
+ }
+
pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () {
for slot in cpuset.__bits.iter_mut() {
*slot = 0;
@@ -2487,28 +2493,44 @@ f! {
}
pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () {
- let size_in___bits = 8 * ::mem::size_of_val(&cpuset.__bits[0]);
- let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits);
+ let size_in_bits
+ = 8 * ::mem::size_of_val(&cpuset.__bits[0]); // 32, 64 etc
+ let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
cpuset.__bits[idx] |= 1 << offset;
()
}
pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () {
- let size_in___bits = 8 * ::mem::size_of_val(&cpuset.__bits[0]);
- let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits);
+ let size_in_bits
+ = 8 * ::mem::size_of_val(&cpuset.__bits[0]); // 32, 64 etc
+ let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
cpuset.__bits[idx] &= !(1 << offset);
()
}
pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool {
- let size_in___bits = 8 * ::mem::size_of_val(&cpuset.__bits[0]);
- let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits);
+ let size_in_bits = 8 * ::mem::size_of_val(&cpuset.__bits[0]);
+ let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
0 != (cpuset.__bits[idx] & (1 << offset))
}
+ pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> ::c_int {
+ let mut s: u32 = 0;
+ let size_of_mask = ::mem::size_of_val(&cpuset.__bits[0]);
+ for i in cpuset.__bits[..(size / size_of_mask)].iter() {
+ s += i.count_ones();
+ };
+ s as ::c_int
+ }
+
+ pub fn CPU_COUNT(cpuset: &cpu_set_t) -> ::c_int {
+ CPU_COUNT_S(::mem::size_of::<cpu_set_t>(), cpuset)
+ }
+
pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool {
set1.__bits == set2.__bits
}
+
pub fn major(dev: ::dev_t) -> ::c_int {
((dev >> 8) & 0xfff) as ::c_int
}