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