xref: /aosp_15_r20/bionic/libc/include/sched.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #pragma once
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker /**
32*8d67ca89SAndroid Build Coastguard Worker  * @file sched.h
33*8d67ca89SAndroid Build Coastguard Worker  * @brief Thread execution scheduling.
34*8d67ca89SAndroid Build Coastguard Worker  */
35*8d67ca89SAndroid Build Coastguard Worker 
36*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
37*8d67ca89SAndroid Build Coastguard Worker 
38*8d67ca89SAndroid Build Coastguard Worker #include <bits/timespec.h>
39*8d67ca89SAndroid Build Coastguard Worker #include <linux/sched.h>
40*8d67ca89SAndroid Build Coastguard Worker 
41*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
42*8d67ca89SAndroid Build Coastguard Worker 
43*8d67ca89SAndroid Build Coastguard Worker /*
44*8d67ca89SAndroid Build Coastguard Worker  * @def SCHED_NORMAL
45*8d67ca89SAndroid Build Coastguard Worker  * The standard (as opposed to real-time) round-robin scheduling policy.
46*8d67ca89SAndroid Build Coastguard Worker  *
47*8d67ca89SAndroid Build Coastguard Worker  * (Linux's name for POSIX's SCHED_OTHER.)
48*8d67ca89SAndroid Build Coastguard Worker  *
49*8d67ca89SAndroid Build Coastguard Worker  * See [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html)
50*8d67ca89SAndroid Build Coastguard Worker  */
51*8d67ca89SAndroid Build Coastguard Worker 
52*8d67ca89SAndroid Build Coastguard Worker /*
53*8d67ca89SAndroid Build Coastguard Worker  * @def SCHED_FIFO
54*8d67ca89SAndroid Build Coastguard Worker  * The real-time first-in/first-out scheduling policy.
55*8d67ca89SAndroid Build Coastguard Worker  *
56*8d67ca89SAndroid Build Coastguard Worker  * See [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html)
57*8d67ca89SAndroid Build Coastguard Worker  */
58*8d67ca89SAndroid Build Coastguard Worker 
59*8d67ca89SAndroid Build Coastguard Worker /*
60*8d67ca89SAndroid Build Coastguard Worker  * @def SCHED_RR
61*8d67ca89SAndroid Build Coastguard Worker  * The real-time round-robin policy. (See also SCHED_NORMAL/SCHED_OTHER.)
62*8d67ca89SAndroid Build Coastguard Worker  *
63*8d67ca89SAndroid Build Coastguard Worker  * See [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html)
64*8d67ca89SAndroid Build Coastguard Worker  */
65*8d67ca89SAndroid Build Coastguard Worker 
66*8d67ca89SAndroid Build Coastguard Worker /*
67*8d67ca89SAndroid Build Coastguard Worker  * @def SCHED_BATCH
68*8d67ca89SAndroid Build Coastguard Worker  * The batch scheduling policy.
69*8d67ca89SAndroid Build Coastguard Worker  *
70*8d67ca89SAndroid Build Coastguard Worker  * See [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html)
71*8d67ca89SAndroid Build Coastguard Worker  */
72*8d67ca89SAndroid Build Coastguard Worker 
73*8d67ca89SAndroid Build Coastguard Worker /*
74*8d67ca89SAndroid Build Coastguard Worker  * @def SCHED_IDLE
75*8d67ca89SAndroid Build Coastguard Worker  * The low priority "only when otherwise idle" scheduling priority.
76*8d67ca89SAndroid Build Coastguard Worker  *
77*8d67ca89SAndroid Build Coastguard Worker  * See [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html)
78*8d67ca89SAndroid Build Coastguard Worker  */
79*8d67ca89SAndroid Build Coastguard Worker 
80*8d67ca89SAndroid Build Coastguard Worker /*
81*8d67ca89SAndroid Build Coastguard Worker  * @def SCHED_DEADLINE
82*8d67ca89SAndroid Build Coastguard Worker  * The deadline scheduling policy.
83*8d67ca89SAndroid Build Coastguard Worker  *
84*8d67ca89SAndroid Build Coastguard Worker  * See [sched(7)](https://man7.org/linux/man-pages/man7/sched.7.html)
85*8d67ca89SAndroid Build Coastguard Worker  */
86*8d67ca89SAndroid Build Coastguard Worker 
87*8d67ca89SAndroid Build Coastguard Worker /*
88*8d67ca89SAndroid Build Coastguard Worker  * The standard (as opposed to real-time) round-robin scheduling policy.
89*8d67ca89SAndroid Build Coastguard Worker  *
90*8d67ca89SAndroid Build Coastguard Worker  * (POSIX's name for Linux's SCHED_NORMAL.)
91*8d67ca89SAndroid Build Coastguard Worker  */
92*8d67ca89SAndroid Build Coastguard Worker #define SCHED_OTHER SCHED_NORMAL
93*8d67ca89SAndroid Build Coastguard Worker 
94*8d67ca89SAndroid Build Coastguard Worker /**
95*8d67ca89SAndroid Build Coastguard Worker  * See sched_getparam()/sched_setparam() and
96*8d67ca89SAndroid Build Coastguard Worker  * sched_getscheduler()/sched_setscheduler().
97*8d67ca89SAndroid Build Coastguard Worker  */
98*8d67ca89SAndroid Build Coastguard Worker struct sched_param {
99*8d67ca89SAndroid Build Coastguard Worker   int sched_priority;
100*8d67ca89SAndroid Build Coastguard Worker };
101*8d67ca89SAndroid Build Coastguard Worker 
102*8d67ca89SAndroid Build Coastguard Worker /**
103*8d67ca89SAndroid Build Coastguard Worker  * [sched_setscheduler(2)](https://man7.org/linux/man-pages/man2/sched_setscheduler.2.html)
104*8d67ca89SAndroid Build Coastguard Worker  * sets the scheduling policy and associated parameters for the given thread.
105*8d67ca89SAndroid Build Coastguard Worker  *
106*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
107*8d67ca89SAndroid Build Coastguard Worker  */
108*8d67ca89SAndroid Build Coastguard Worker int sched_setscheduler(pid_t __pid, int __policy, const struct sched_param* _Nonnull __param);
109*8d67ca89SAndroid Build Coastguard Worker 
110*8d67ca89SAndroid Build Coastguard Worker /**
111*8d67ca89SAndroid Build Coastguard Worker  * [sched_getscheduler(2)](https://man7.org/linux/man-pages/man2/sched_getscheduler.2)
112*8d67ca89SAndroid Build Coastguard Worker  * gets the scheduling policy for the given thread.
113*8d67ca89SAndroid Build Coastguard Worker  *
114*8d67ca89SAndroid Build Coastguard Worker  * Returns a non-negative thread policy on success and returns -1 and sets
115*8d67ca89SAndroid Build Coastguard Worker  * `errno` on failure.
116*8d67ca89SAndroid Build Coastguard Worker  */
117*8d67ca89SAndroid Build Coastguard Worker int sched_getscheduler(pid_t __pid);
118*8d67ca89SAndroid Build Coastguard Worker 
119*8d67ca89SAndroid Build Coastguard Worker /**
120*8d67ca89SAndroid Build Coastguard Worker  * [sched_yield(2)](https://man7.org/linux/man-pages/man2/sched_yield.2.html)
121*8d67ca89SAndroid Build Coastguard Worker  * voluntarily gives up using the CPU so that another thread can run.
122*8d67ca89SAndroid Build Coastguard Worker  *
123*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
124*8d67ca89SAndroid Build Coastguard Worker  */
125*8d67ca89SAndroid Build Coastguard Worker int sched_yield(void);
126*8d67ca89SAndroid Build Coastguard Worker 
127*8d67ca89SAndroid Build Coastguard Worker /**
128*8d67ca89SAndroid Build Coastguard Worker  * [sched_get_priority_max(2)](https://man7.org/linux/man-pages/man2/sched_get_priority_max.2.html)
129*8d67ca89SAndroid Build Coastguard Worker  * gets the maximum priority value allowed for the given scheduling policy.
130*8d67ca89SAndroid Build Coastguard Worker  *
131*8d67ca89SAndroid Build Coastguard Worker  * Returns a priority on success and returns -1 and sets `errno` on failure.
132*8d67ca89SAndroid Build Coastguard Worker  */
133*8d67ca89SAndroid Build Coastguard Worker int sched_get_priority_max(int __policy);
134*8d67ca89SAndroid Build Coastguard Worker 
135*8d67ca89SAndroid Build Coastguard Worker /**
136*8d67ca89SAndroid Build Coastguard Worker  * [sched_get_priority_min(2)](https://man7.org/linux/man-pages/man2/sched_get_priority_min.2.html)
137*8d67ca89SAndroid Build Coastguard Worker  * gets the minimum priority value allowed for the given scheduling policy.
138*8d67ca89SAndroid Build Coastguard Worker  *
139*8d67ca89SAndroid Build Coastguard Worker  * Returns a priority on success and returns -1 and sets `errno` on failure.
140*8d67ca89SAndroid Build Coastguard Worker  */
141*8d67ca89SAndroid Build Coastguard Worker int sched_get_priority_min(int __policy);
142*8d67ca89SAndroid Build Coastguard Worker 
143*8d67ca89SAndroid Build Coastguard Worker /**
144*8d67ca89SAndroid Build Coastguard Worker  * [sched_setparam(2)](https://man7.org/linux/man-pages/man2/sched_setparam.2.html)
145*8d67ca89SAndroid Build Coastguard Worker  * sets the scheduling parameters for the given thread.
146*8d67ca89SAndroid Build Coastguard Worker  *
147*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
148*8d67ca89SAndroid Build Coastguard Worker  */
149*8d67ca89SAndroid Build Coastguard Worker int sched_setparam(pid_t __pid, const struct sched_param* _Nonnull __param);
150*8d67ca89SAndroid Build Coastguard Worker 
151*8d67ca89SAndroid Build Coastguard Worker /**
152*8d67ca89SAndroid Build Coastguard Worker  * [sched_getparam(2)](https://man7.org/linux/man-pages/man2/sched_getparam.2.html)
153*8d67ca89SAndroid Build Coastguard Worker  * gets the scheduling parameters for the given thread.
154*8d67ca89SAndroid Build Coastguard Worker  *
155*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
156*8d67ca89SAndroid Build Coastguard Worker  */
157*8d67ca89SAndroid Build Coastguard Worker int sched_getparam(pid_t __pid, struct sched_param* _Nonnull __param);
158*8d67ca89SAndroid Build Coastguard Worker 
159*8d67ca89SAndroid Build Coastguard Worker /**
160*8d67ca89SAndroid Build Coastguard Worker  * [sched_rr_get_interval(2)](https://man7.org/linux/man-pages/man2/sched_rr_get_interval.2.html)
161*8d67ca89SAndroid Build Coastguard Worker  * queries the round-robin time quantum for the given thread.
162*8d67ca89SAndroid Build Coastguard Worker  *
163*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
164*8d67ca89SAndroid Build Coastguard Worker  */
165*8d67ca89SAndroid Build Coastguard Worker int sched_rr_get_interval(pid_t __pid, struct timespec* _Nonnull __quantum);
166*8d67ca89SAndroid Build Coastguard Worker 
167*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU)
168*8d67ca89SAndroid Build Coastguard Worker 
169*8d67ca89SAndroid Build Coastguard Worker /**
170*8d67ca89SAndroid Build Coastguard Worker  * [clone(2)](https://man7.org/linux/man-pages/man2/clone.2.html)
171*8d67ca89SAndroid Build Coastguard Worker  * creates a new child process.
172*8d67ca89SAndroid Build Coastguard Worker  *
173*8d67ca89SAndroid Build Coastguard Worker  * Returns the pid of the child to the caller on success and
174*8d67ca89SAndroid Build Coastguard Worker  * returns -1 and sets `errno` on failure.
175*8d67ca89SAndroid Build Coastguard Worker  */
176*8d67ca89SAndroid Build Coastguard Worker int clone(int (* __BIONIC_COMPLICATED_NULLNESS __fn)(void* __BIONIC_COMPLICATED_NULLNESS ), void* __BIONIC_COMPLICATED_NULLNESS __child_stack, int __flags, void* _Nullable __arg, ...);
177*8d67ca89SAndroid Build Coastguard Worker 
178*8d67ca89SAndroid Build Coastguard Worker /**
179*8d67ca89SAndroid Build Coastguard Worker  * [unshare(2)](https://man7.org/linux/man-pages/man2/unshare.2.html)
180*8d67ca89SAndroid Build Coastguard Worker  * disassociates part of the caller's execution context.
181*8d67ca89SAndroid Build Coastguard Worker  *
182*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
183*8d67ca89SAndroid Build Coastguard Worker  */
184*8d67ca89SAndroid Build Coastguard Worker int unshare(int __flags);
185*8d67ca89SAndroid Build Coastguard Worker 
186*8d67ca89SAndroid Build Coastguard Worker /**
187*8d67ca89SAndroid Build Coastguard Worker  * [setns(2)](https://man7.org/linux/man-pages/man2/setns.2.html)
188*8d67ca89SAndroid Build Coastguard Worker  * reassociates a thread with a different namespace.
189*8d67ca89SAndroid Build Coastguard Worker  *
190*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
191*8d67ca89SAndroid Build Coastguard Worker  */
192*8d67ca89SAndroid Build Coastguard Worker int setns(int __fd, int __ns_type);
193*8d67ca89SAndroid Build Coastguard Worker 
194*8d67ca89SAndroid Build Coastguard Worker /**
195*8d67ca89SAndroid Build Coastguard Worker  * [sched_getcpu(3)](https://man7.org/linux/man-pages/man3/sched_getcpu.3.html)
196*8d67ca89SAndroid Build Coastguard Worker  * reports which CPU the caller is running on.
197*8d67ca89SAndroid Build Coastguard Worker  *
198*8d67ca89SAndroid Build Coastguard Worker  * Returns a non-negative CPU number on success and returns -1 and sets
199*8d67ca89SAndroid Build Coastguard Worker  * `errno` on failure.
200*8d67ca89SAndroid Build Coastguard Worker  */
201*8d67ca89SAndroid Build Coastguard Worker int sched_getcpu(void);
202*8d67ca89SAndroid Build Coastguard Worker 
203*8d67ca89SAndroid Build Coastguard Worker #ifdef __LP64__
204*8d67ca89SAndroid Build Coastguard Worker #define CPU_SETSIZE 1024
205*8d67ca89SAndroid Build Coastguard Worker #else
206*8d67ca89SAndroid Build Coastguard Worker #define CPU_SETSIZE 32
207*8d67ca89SAndroid Build Coastguard Worker #endif
208*8d67ca89SAndroid Build Coastguard Worker 
209*8d67ca89SAndroid Build Coastguard Worker #define __CPU_BITTYPE  unsigned long int  /* mandated by the kernel  */
210*8d67ca89SAndroid Build Coastguard Worker #define __CPU_BITS     (8 * sizeof(__CPU_BITTYPE))
211*8d67ca89SAndroid Build Coastguard Worker #define __CPU_ELT(x)   ((x) / __CPU_BITS)
212*8d67ca89SAndroid Build Coastguard Worker #define __CPU_MASK(x)  ((__CPU_BITTYPE)1 << ((x) & (__CPU_BITS - 1)))
213*8d67ca89SAndroid Build Coastguard Worker 
214*8d67ca89SAndroid Build Coastguard Worker /**
215*8d67ca89SAndroid Build Coastguard Worker  * [cpu_set_t](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) is a
216*8d67ca89SAndroid Build Coastguard Worker  * statically-sized CPU set. See `CPU_ALLOC` for dynamically-sized CPU sets.
217*8d67ca89SAndroid Build Coastguard Worker  */
218*8d67ca89SAndroid Build Coastguard Worker typedef struct {
219*8d67ca89SAndroid Build Coastguard Worker   __CPU_BITTYPE  __bits[ CPU_SETSIZE / __CPU_BITS ];
220*8d67ca89SAndroid Build Coastguard Worker } cpu_set_t;
221*8d67ca89SAndroid Build Coastguard Worker 
222*8d67ca89SAndroid Build Coastguard Worker /**
223*8d67ca89SAndroid Build Coastguard Worker  * [sched_setaffinity(2)](https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html)
224*8d67ca89SAndroid Build Coastguard Worker  * sets the CPU affinity mask for the given thread.
225*8d67ca89SAndroid Build Coastguard Worker  *
226*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
227*8d67ca89SAndroid Build Coastguard Worker  */
228*8d67ca89SAndroid Build Coastguard Worker int sched_setaffinity(pid_t __pid, size_t __set_size, const cpu_set_t* _Nonnull __set);
229*8d67ca89SAndroid Build Coastguard Worker 
230*8d67ca89SAndroid Build Coastguard Worker /**
231*8d67ca89SAndroid Build Coastguard Worker  * [sched_getaffinity(2)](https://man7.org/linux/man-pages/man2/sched_getaffinity.2.html)
232*8d67ca89SAndroid Build Coastguard Worker  * gets the CPU affinity mask for the given thread.
233*8d67ca89SAndroid Build Coastguard Worker  *
234*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success and returns -1 and sets `errno` on failure.
235*8d67ca89SAndroid Build Coastguard Worker  */
236*8d67ca89SAndroid Build Coastguard Worker int sched_getaffinity(pid_t __pid, size_t __set_size, cpu_set_t* _Nonnull __set);
237*8d67ca89SAndroid Build Coastguard Worker 
238*8d67ca89SAndroid Build Coastguard Worker /**
239*8d67ca89SAndroid Build Coastguard Worker  * [CPU_ZERO](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) clears all
240*8d67ca89SAndroid Build Coastguard Worker  * bits in a static CPU set.
241*8d67ca89SAndroid Build Coastguard Worker  */
242*8d67ca89SAndroid Build Coastguard Worker #define CPU_ZERO(set)          CPU_ZERO_S(sizeof(cpu_set_t), set)
243*8d67ca89SAndroid Build Coastguard Worker /**
244*8d67ca89SAndroid Build Coastguard Worker  * [CPU_ZERO_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) clears all
245*8d67ca89SAndroid Build Coastguard Worker  * bits in a dynamic CPU set allocated by `CPU_ALLOC`.
246*8d67ca89SAndroid Build Coastguard Worker  */
247*8d67ca89SAndroid Build Coastguard Worker #define CPU_ZERO_S(setsize, set)  __builtin_memset(set, 0, setsize)
248*8d67ca89SAndroid Build Coastguard Worker 
249*8d67ca89SAndroid Build Coastguard Worker /**
250*8d67ca89SAndroid Build Coastguard Worker  * [CPU_SET](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) sets one
251*8d67ca89SAndroid Build Coastguard Worker  * bit in a static CPU set.
252*8d67ca89SAndroid Build Coastguard Worker  */
253*8d67ca89SAndroid Build Coastguard Worker #define CPU_SET(cpu, set)      CPU_SET_S(cpu, sizeof(cpu_set_t), set)
254*8d67ca89SAndroid Build Coastguard Worker /**
255*8d67ca89SAndroid Build Coastguard Worker  * [CPU_SET_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) sets one
256*8d67ca89SAndroid Build Coastguard Worker  * bit in a dynamic CPU set allocated by `CPU_ALLOC`.
257*8d67ca89SAndroid Build Coastguard Worker  */
258*8d67ca89SAndroid Build Coastguard Worker #define CPU_SET_S(cpu, setsize, set) \
259*8d67ca89SAndroid Build Coastguard Worker   do { \
260*8d67ca89SAndroid Build Coastguard Worker     size_t __cpu = (cpu); \
261*8d67ca89SAndroid Build Coastguard Worker     if (__cpu < 8 * (setsize)) \
262*8d67ca89SAndroid Build Coastguard Worker       (set)->__bits[__CPU_ELT(__cpu)] |= __CPU_MASK(__cpu); \
263*8d67ca89SAndroid Build Coastguard Worker   } while (0)
264*8d67ca89SAndroid Build Coastguard Worker 
265*8d67ca89SAndroid Build Coastguard Worker /**
266*8d67ca89SAndroid Build Coastguard Worker  * [CPU_CLR](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) clears one
267*8d67ca89SAndroid Build Coastguard Worker  * bit in a static CPU set.
268*8d67ca89SAndroid Build Coastguard Worker  */
269*8d67ca89SAndroid Build Coastguard Worker #define CPU_CLR(cpu, set)      CPU_CLR_S(cpu, sizeof(cpu_set_t), set)
270*8d67ca89SAndroid Build Coastguard Worker /**
271*8d67ca89SAndroid Build Coastguard Worker  * [CPU_CLR_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) clears one
272*8d67ca89SAndroid Build Coastguard Worker  * bit in a dynamic CPU set allocated by `CPU_ALLOC`.
273*8d67ca89SAndroid Build Coastguard Worker  */
274*8d67ca89SAndroid Build Coastguard Worker #define CPU_CLR_S(cpu, setsize, set) \
275*8d67ca89SAndroid Build Coastguard Worker   do { \
276*8d67ca89SAndroid Build Coastguard Worker     size_t __cpu = (cpu); \
277*8d67ca89SAndroid Build Coastguard Worker     if (__cpu < 8 * (setsize)) \
278*8d67ca89SAndroid Build Coastguard Worker       (set)->__bits[__CPU_ELT(__cpu)] &= ~__CPU_MASK(__cpu); \
279*8d67ca89SAndroid Build Coastguard Worker   } while (0)
280*8d67ca89SAndroid Build Coastguard Worker 
281*8d67ca89SAndroid Build Coastguard Worker /**
282*8d67ca89SAndroid Build Coastguard Worker  * [CPU_ISSET](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) tests
283*8d67ca89SAndroid Build Coastguard Worker  * whether the given bit is set in a static CPU set.
284*8d67ca89SAndroid Build Coastguard Worker  */
285*8d67ca89SAndroid Build Coastguard Worker #define CPU_ISSET(cpu, set)    CPU_ISSET_S(cpu, sizeof(cpu_set_t), set)
286*8d67ca89SAndroid Build Coastguard Worker /**
287*8d67ca89SAndroid Build Coastguard Worker  * [CPU_ISSET_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) tests
288*8d67ca89SAndroid Build Coastguard Worker  * whether the given bit is set in a dynamic CPU set allocated by `CPU_ALLOC`.
289*8d67ca89SAndroid Build Coastguard Worker  */
290*8d67ca89SAndroid Build Coastguard Worker #define CPU_ISSET_S(cpu, setsize, set) \
291*8d67ca89SAndroid Build Coastguard Worker   (__extension__ ({ \
292*8d67ca89SAndroid Build Coastguard Worker     size_t __cpu = (cpu); \
293*8d67ca89SAndroid Build Coastguard Worker     (__cpu < 8 * (setsize)) \
294*8d67ca89SAndroid Build Coastguard Worker       ? ((set)->__bits[__CPU_ELT(__cpu)] & __CPU_MASK(__cpu)) != 0 \
295*8d67ca89SAndroid Build Coastguard Worker       : 0; \
296*8d67ca89SAndroid Build Coastguard Worker   }))
297*8d67ca89SAndroid Build Coastguard Worker 
298*8d67ca89SAndroid Build Coastguard Worker /**
299*8d67ca89SAndroid Build Coastguard Worker  * [CPU_COUNT](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) counts
300*8d67ca89SAndroid Build Coastguard Worker  * how many bits are set in a static CPU set.
301*8d67ca89SAndroid Build Coastguard Worker  */
302*8d67ca89SAndroid Build Coastguard Worker #define CPU_COUNT(set)         CPU_COUNT_S(sizeof(cpu_set_t), set)
303*8d67ca89SAndroid Build Coastguard Worker /**
304*8d67ca89SAndroid Build Coastguard Worker  * [CPU_COUNT_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) counts
305*8d67ca89SAndroid Build Coastguard Worker  * how many bits are set in a dynamic CPU set allocated by `CPU_ALLOC`.
306*8d67ca89SAndroid Build Coastguard Worker  */
307*8d67ca89SAndroid Build Coastguard Worker #define CPU_COUNT_S(setsize, set)  __sched_cpucount((setsize), (set))
308*8d67ca89SAndroid Build Coastguard Worker int __sched_cpucount(size_t __set_size, const cpu_set_t* _Nonnull __set);
309*8d67ca89SAndroid Build Coastguard Worker 
310*8d67ca89SAndroid Build Coastguard Worker /**
311*8d67ca89SAndroid Build Coastguard Worker  * [CPU_EQUAL](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) tests
312*8d67ca89SAndroid Build Coastguard Worker  * whether two static CPU sets have the same bits set and cleared as each other.
313*8d67ca89SAndroid Build Coastguard Worker  */
314*8d67ca89SAndroid Build Coastguard Worker #define CPU_EQUAL(set1, set2)  CPU_EQUAL_S(sizeof(cpu_set_t), set1, set2)
315*8d67ca89SAndroid Build Coastguard Worker /**
316*8d67ca89SAndroid Build Coastguard Worker  * [CPU_EQUAL_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) tests
317*8d67ca89SAndroid Build Coastguard Worker  * whether two dynamic CPU sets allocated by `CPU_ALLOC` have the same bits
318*8d67ca89SAndroid Build Coastguard Worker  * set and cleared as each other.
319*8d67ca89SAndroid Build Coastguard Worker  */
320*8d67ca89SAndroid Build Coastguard Worker #define CPU_EQUAL_S(setsize, set1, set2)  (__builtin_memcmp(set1, set2, setsize) == 0)
321*8d67ca89SAndroid Build Coastguard Worker 
322*8d67ca89SAndroid Build Coastguard Worker /**
323*8d67ca89SAndroid Build Coastguard Worker  * [CPU_AND](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) ands two
324*8d67ca89SAndroid Build Coastguard Worker  * static CPU sets.
325*8d67ca89SAndroid Build Coastguard Worker  */
326*8d67ca89SAndroid Build Coastguard Worker #define CPU_AND(dst, set1, set2)  __CPU_OP(dst, set1, set2, &)
327*8d67ca89SAndroid Build Coastguard Worker /**
328*8d67ca89SAndroid Build Coastguard Worker  * [CPU_AND_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) ands two
329*8d67ca89SAndroid Build Coastguard Worker  * dynamic CPU sets allocated by `CPU_ALLOC`.
330*8d67ca89SAndroid Build Coastguard Worker  */
331*8d67ca89SAndroid Build Coastguard Worker #define CPU_AND_S(setsize, dst, set1, set2)  __CPU_OP_S(setsize, dst, set1, set2, &)
332*8d67ca89SAndroid Build Coastguard Worker 
333*8d67ca89SAndroid Build Coastguard Worker /**
334*8d67ca89SAndroid Build Coastguard Worker  * [CPU_OR](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) ors two
335*8d67ca89SAndroid Build Coastguard Worker  * static CPU sets.
336*8d67ca89SAndroid Build Coastguard Worker  */
337*8d67ca89SAndroid Build Coastguard Worker #define CPU_OR(dst, set1, set2)   __CPU_OP(dst, set1, set2, |)
338*8d67ca89SAndroid Build Coastguard Worker /**
339*8d67ca89SAndroid Build Coastguard Worker  * [CPU_OR_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html) ors two
340*8d67ca89SAndroid Build Coastguard Worker  * dynamic CPU sets allocated by `CPU_ALLOC`.
341*8d67ca89SAndroid Build Coastguard Worker  */
342*8d67ca89SAndroid Build Coastguard Worker #define CPU_OR_S(setsize, dst, set1, set2)   __CPU_OP_S(setsize, dst, set1, set2, |)
343*8d67ca89SAndroid Build Coastguard Worker 
344*8d67ca89SAndroid Build Coastguard Worker /**
345*8d67ca89SAndroid Build Coastguard Worker  * [CPU_XOR](https://man7.org/linux/man-pages/man3/CPU_SET.3.html)
346*8d67ca89SAndroid Build Coastguard Worker  * exclusive-ors two static CPU sets.
347*8d67ca89SAndroid Build Coastguard Worker  */
348*8d67ca89SAndroid Build Coastguard Worker #define CPU_XOR(dst, set1, set2)  __CPU_OP(dst, set1, set2, ^)
349*8d67ca89SAndroid Build Coastguard Worker /**
350*8d67ca89SAndroid Build Coastguard Worker  * [CPU_XOR_S](https://man7.org/linux/man-pages/man3/CPU_SET.3.html)
351*8d67ca89SAndroid Build Coastguard Worker  * exclusive-ors two dynamic CPU sets allocated by `CPU_ALLOC`.
352*8d67ca89SAndroid Build Coastguard Worker  */
353*8d67ca89SAndroid Build Coastguard Worker #define CPU_XOR_S(setsize, dst, set1, set2)  __CPU_OP_S(setsize, dst, set1, set2, ^)
354*8d67ca89SAndroid Build Coastguard Worker 
355*8d67ca89SAndroid Build Coastguard Worker #define __CPU_OP(dst, set1, set2, op)  __CPU_OP_S(sizeof(cpu_set_t), dst, set1, set2, op)
356*8d67ca89SAndroid Build Coastguard Worker 
357*8d67ca89SAndroid Build Coastguard Worker #define __CPU_OP_S(setsize, dstset, srcset1, srcset2, op) \
358*8d67ca89SAndroid Build Coastguard Worker   do { \
359*8d67ca89SAndroid Build Coastguard Worker     cpu_set_t* __dst = (dstset); \
360*8d67ca89SAndroid Build Coastguard Worker     const __CPU_BITTYPE* __src1 = (srcset1)->__bits; \
361*8d67ca89SAndroid Build Coastguard Worker     const __CPU_BITTYPE* __src2 = (srcset2)->__bits; \
362*8d67ca89SAndroid Build Coastguard Worker     size_t __nn = 0, __nn_max = (setsize)/sizeof(__CPU_BITTYPE); \
363*8d67ca89SAndroid Build Coastguard Worker     for (; __nn < __nn_max; __nn++) \
364*8d67ca89SAndroid Build Coastguard Worker       (__dst)->__bits[__nn] = __src1[__nn] op __src2[__nn]; \
365*8d67ca89SAndroid Build Coastguard Worker   } while (0)
366*8d67ca89SAndroid Build Coastguard Worker 
367*8d67ca89SAndroid Build Coastguard Worker /**
368*8d67ca89SAndroid Build Coastguard Worker  * [CPU_ALLOC_SIZE](https://man7.org/linux/man-pages/man3/CPU_SET.3.html)
369*8d67ca89SAndroid Build Coastguard Worker  * returns the size of a CPU set large enough for CPUs in the range 0..count-1.
370*8d67ca89SAndroid Build Coastguard Worker  */
371*8d67ca89SAndroid Build Coastguard Worker #define CPU_ALLOC_SIZE(count) \
372*8d67ca89SAndroid Build Coastguard Worker   __CPU_ELT((count) + (__CPU_BITS - 1)) * sizeof(__CPU_BITTYPE)
373*8d67ca89SAndroid Build Coastguard Worker 
374*8d67ca89SAndroid Build Coastguard Worker /**
375*8d67ca89SAndroid Build Coastguard Worker  * [CPU_ALLOC](https://man7.org/linux/man-pages/man3/CPU_SET.3.html)
376*8d67ca89SAndroid Build Coastguard Worker  * allocates a CPU set large enough for CPUs in the range 0..count-1.
377*8d67ca89SAndroid Build Coastguard Worker  */
378*8d67ca89SAndroid Build Coastguard Worker #define CPU_ALLOC(count)  __sched_cpualloc((count))
379*8d67ca89SAndroid Build Coastguard Worker cpu_set_t* _Nullable __sched_cpualloc(size_t __count);
380*8d67ca89SAndroid Build Coastguard Worker 
381*8d67ca89SAndroid Build Coastguard Worker /**
382*8d67ca89SAndroid Build Coastguard Worker  * [CPU_FREE](https://man7.org/linux/man-pages/man3/CPU_SET.3.html)
383*8d67ca89SAndroid Build Coastguard Worker  * deallocates a CPU set allocated by `CPU_ALLOC`.
384*8d67ca89SAndroid Build Coastguard Worker  */
385*8d67ca89SAndroid Build Coastguard Worker #define CPU_FREE(set)     __sched_cpufree((set))
386*8d67ca89SAndroid Build Coastguard Worker void __sched_cpufree(cpu_set_t* _Nonnull __set);
387*8d67ca89SAndroid Build Coastguard Worker 
388*8d67ca89SAndroid Build Coastguard Worker #endif /* __USE_GNU */
389*8d67ca89SAndroid Build Coastguard Worker 
390*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
391