redrust/
setcpuaffinity.rs

1extern crate c2rust_bitfields;
2extern crate libc;
3extern crate core;
4extern "C" {
5    fn strtoul(
6        _: *const libc::c_char,
7        _: *mut *mut libc::c_char,
8        _: libc::c_int,
9    ) -> libc::c_ulong;
10    fn strchr(_: *const libc::c_char, _: libc::c_int) -> *mut libc::c_char;
11    fn __ctype_b_loc() -> *mut *const libc::c_ushort;
12    fn sched_setaffinity(
13        __pid: __pid_t,
14        __cpusetsize: size_t,
15        __cpuset: *const cpu_set_t,
16    ) -> libc::c_int;
17}
18pub type size_t = libc::c_ulong;
19pub type __pid_t = libc::c_int;
20pub type C2RustUnnamed = libc::c_uint;
21pub const _ISalnum: C2RustUnnamed = 8;
22pub const _ISpunct: C2RustUnnamed = 4;
23pub const _IScntrl: C2RustUnnamed = 2;
24pub const _ISblank: C2RustUnnamed = 1;
25pub const _ISgraph: C2RustUnnamed = 32768;
26pub const _ISprint: C2RustUnnamed = 16384;
27pub const _ISspace: C2RustUnnamed = 8192;
28pub const _ISxdigit: C2RustUnnamed = 4096;
29pub const _ISdigit: C2RustUnnamed = 2048;
30pub const _ISalpha: C2RustUnnamed = 1024;
31pub const _ISlower: C2RustUnnamed = 512;
32pub const _ISupper: C2RustUnnamed = 256;
33pub type __cpu_mask = libc::c_ulong;
34#[derive(Copy, Clone)]
35#[repr(C)]
36pub struct cpu_set_t {
37    pub __bits: [__cpu_mask; 16],
38}
39unsafe extern "C" fn next_token(
40    mut q: *const libc::c_char,
41    mut sep: libc::c_int,
42) -> *const libc::c_char {
43    if !q.is_null() {
44        q = strchr(q, sep);
45    }
46    if !q.is_null() {
47        q = q.offset(1);
48    }
49    return q;
50}
51unsafe extern "C" fn next_num(
52    mut str: *const libc::c_char,
53    mut end: *mut *mut libc::c_char,
54    mut result: *mut libc::c_int,
55) -> libc::c_int {
56    if str.is_null() || *str as libc::c_int == '\0' as i32
57        || *(*__ctype_b_loc()).offset(*str as libc::c_int as isize) as libc::c_int
58            & _ISdigit as libc::c_int as libc::c_ushort as libc::c_int == 0
59    {
60        return -(1 as libc::c_int);
61    }
62    *result = strtoul(str, end, 10 as libc::c_int) as libc::c_int;
63    if str == *end as *const libc::c_char {
64        return -(1 as libc::c_int);
65    }
66    return 0 as libc::c_int;
67}
68#[no_mangle]
69pub unsafe extern "C" fn setcpuaffinity(mut cpulist: *const libc::c_char) {
70    let mut p: *const libc::c_char = 0 as *const libc::c_char;
71    let mut q: *const libc::c_char = 0 as *const libc::c_char;
72    let mut end: *mut libc::c_char = 0 as *mut libc::c_char;
73    let mut cpuset: cpu_set_t = cpu_set_t { __bits: [0; 16] };
74    if cpulist.is_null() {
75        return;
76    }
77    libc::memset(
78        &mut cpuset as *mut cpu_set_t as *mut libc::c_void,
79        '\0' as i32,
80        core::mem::size_of::<cpu_set_t>() as libc::c_ulong as libc::size_t,
81    );
82    q = cpulist;
83    loop {
84        p = q;
85        q = next_token(q, ',' as i32);
86        if p.is_null() {
87            break;
88        }
89        let mut a: libc::c_int = 0;
90        let mut b: libc::c_int = 0;
91        let mut s: libc::c_int = 0;
92        let mut c1: *const libc::c_char = 0 as *const libc::c_char;
93        let mut c2: *const libc::c_char = 0 as *const libc::c_char;
94        if next_num(p, &mut end, &mut a) != 0 as libc::c_int {
95            return;
96        }
97        b = a;
98        s = 1 as libc::c_int;
99        p = end;
100        c1 = next_token(p, '-' as i32);
101        c2 = next_token(p, ',' as i32);
102        if !c1.is_null() && (c2.is_null() || c1 < c2) {
103            if next_num(c1, &mut end, &mut b) != 0 as libc::c_int {
104                return;
105            }
106            c1 = if !end.is_null() && *end as libc::c_int != 0 {
107                next_token(end, ':' as i32)
108            } else {
109                0 as *const libc::c_char
110            };
111            if !c1.is_null() && (c2.is_null() || c1 < c2) {
112                if next_num(c1, &mut end, &mut s) != 0 as libc::c_int {
113                    return;
114                }
115                if s == 0 as libc::c_int {
116                    return;
117                }
118            }
119        }
120        if a > b {
121            return;
122        }
123        while a <= b {
124            let mut __cpu: size_t = a as size_t;
125            if __cpu.wrapping_div(8 as libc::c_int as libc::c_ulong)
126                < core::mem::size_of::<cpu_set_t>() as libc::c_ulong
127            {
128                let ref mut fresh0 = *(cpuset.__bits)
129                    .as_mut_ptr()
130                    .offset(
131                        __cpu
132                            .wrapping_div(
133                                (8 as libc::c_int as libc::c_ulong)
134                                    .wrapping_mul(
135                                        core::mem::size_of::<__cpu_mask>() as libc::c_ulong,
136                                    ),
137                            ) as isize,
138                    );
139                *fresh0
140                    |= (1 as libc::c_int as __cpu_mask)
141                        << __cpu
142                            .wrapping_rem(
143                                (8 as libc::c_int as libc::c_ulong)
144                                    .wrapping_mul(
145                                        core::mem::size_of::<__cpu_mask>() as libc::c_ulong,
146                                    ),
147                            );
148            } else {};
149            a += s;
150        }
151    }
152    if !end.is_null() && *end as libc::c_int != 0 {
153        return;
154    }
155    sched_setaffinity(
156        0 as libc::c_int,
157        core::mem::size_of::<cpu_set_t>() as libc::c_ulong,
158        &mut cpuset,
159    );
160}