| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2008 The Android Open Source Project | 
|  | 3 | * All rights reserved. | 
|  | 4 | * | 
|  | 5 | * Redistribution and use in source and binary forms, with or without | 
|  | 6 | * modification, are permitted provided that the following conditions | 
|  | 7 | * are met: | 
|  | 8 | *  * Redistributions of source code must retain the above copyright | 
|  | 9 | *    notice, this list of conditions and the following disclaimer. | 
|  | 10 | *  * Redistributions in binary form must reproduce the above copyright | 
|  | 11 | *    notice, this list of conditions and the following disclaimer in | 
|  | 12 | *    the documentation and/or other materials provided with the | 
|  | 13 | *    distribution. | 
|  | 14 | * | 
|  | 15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
|  | 16 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
|  | 17 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | 
|  | 18 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | 
|  | 19 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
|  | 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | 
|  | 21 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | 
|  | 22 | * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | 
|  | 23 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
|  | 24 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | 
|  | 25 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
|  | 26 | * SUCH DAMAGE. | 
|  | 27 | */ | 
|  | 28 | #ifndef _SCHED_H_ | 
|  | 29 | #define _SCHED_H_ | 
|  | 30 |  | 
|  | 31 | #include <sys/cdefs.h> | 
|  | 32 | #include <sys/time.h> | 
|  | 33 |  | 
| Elliott Hughes | 887e114 | 2014-01-02 12:05:50 -0800 | [diff] [blame] | 34 | #include <linux/sched.h> | 
|  | 35 |  | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 36 | __BEGIN_DECLS | 
|  | 37 |  | 
| Elliott Hughes | 887e114 | 2014-01-02 12:05:50 -0800 | [diff] [blame] | 38 | /* This name is used by glibc, but not by the kernel. */ | 
|  | 39 | #define SCHED_OTHER SCHED_NORMAL | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 40 |  | 
|  | 41 | struct sched_param { | 
| Elliott Hughes | bbb34f9 | 2014-01-07 17:48:30 -0800 | [diff] [blame] | 42 | int __sched_priority; | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 43 | }; | 
| Elliott Hughes | bbb34f9 | 2014-01-07 17:48:30 -0800 | [diff] [blame] | 44 | #define sched_priority __sched_priority | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 45 |  | 
| Elliott Hughes | 887e114 | 2014-01-02 12:05:50 -0800 | [diff] [blame] | 46 | extern int sched_setscheduler(pid_t, int, const struct sched_param*); | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 47 | extern int sched_getscheduler(pid_t); | 
|  | 48 | extern int sched_yield(void); | 
| Elliott Hughes | 887e114 | 2014-01-02 12:05:50 -0800 | [diff] [blame] | 49 | extern int sched_get_priority_max(int); | 
|  | 50 | extern int sched_get_priority_min(int); | 
|  | 51 | extern int sched_setparam(pid_t, const struct sched_param*); | 
|  | 52 | extern int sched_getparam(pid_t, struct sched_param*); | 
|  | 53 | extern int sched_rr_get_interval(pid_t, struct timespec*); | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 54 |  | 
| David 'Digit' Turner | bb5581a | 2010-10-09 17:56:55 +0200 | [diff] [blame] | 55 | #ifdef _GNU_SOURCE | 
| Elliott Hughes | 887e114 | 2014-01-02 12:05:50 -0800 | [diff] [blame] | 56 |  | 
|  | 57 | extern int clone(int (*)(void*), void*, int, void*, ...); | 
| Jeff Sharkey | 82393de | 2012-08-11 14:12:26 -0700 | [diff] [blame] | 58 | extern int unshare(int); | 
| David 'Digit' Turner | 72e6fd4 | 2010-12-03 18:04:01 +0100 | [diff] [blame] | 59 | extern int sched_getcpu(void); | 
| Elliott Hughes | 887e114 | 2014-01-02 12:05:50 -0800 | [diff] [blame] | 60 | extern int setns(int, int); | 
| David 'Digit' Turner | 72e6fd4 | 2010-12-03 18:04:01 +0100 | [diff] [blame] | 61 |  | 
|  | 62 | /* Our implementation supports up to 32 independent CPUs, which is also | 
|  | 63 | * the maximum supported by the kernel at the moment. GLibc uses 1024 by | 
|  | 64 | * default. | 
|  | 65 | * | 
|  | 66 | * If you want to use more than that, you should use CPU_ALLOC() / CPU_FREE() | 
|  | 67 | * and the CPU_XXX_S() macro variants. | 
|  | 68 | */ | 
|  | 69 | #define CPU_SETSIZE   32 | 
|  | 70 |  | 
|  | 71 | #define __CPU_BITTYPE    unsigned long int  /* mandated by the kernel  */ | 
|  | 72 | #define __CPU_BITSHIFT   5                  /* should be log2(BITTYPE) */ | 
|  | 73 | #define __CPU_BITS       (1 << __CPU_BITSHIFT) | 
|  | 74 | #define __CPU_ELT(x)     ((x) >> __CPU_BITSHIFT) | 
|  | 75 | #define __CPU_MASK(x)    ((__CPU_BITTYPE)1 << ((x) & (__CPU_BITS-1))) | 
|  | 76 |  | 
|  | 77 | typedef struct { | 
|  | 78 | __CPU_BITTYPE  __bits[ CPU_SETSIZE / __CPU_BITS ]; | 
|  | 79 | } cpu_set_t; | 
|  | 80 |  | 
|  | 81 | extern int sched_setaffinity(pid_t pid, size_t setsize, const cpu_set_t* set); | 
|  | 82 |  | 
|  | 83 | extern int sched_getaffinity(pid_t pid, size_t setsize, cpu_set_t* set); | 
|  | 84 |  | 
|  | 85 | /* Provide optimized implementation for 32-bit cpu_set_t */ | 
|  | 86 | #if CPU_SETSIZE == __CPU_BITS | 
|  | 87 |  | 
|  | 88 | #  define CPU_ZERO(set_)   \ | 
|  | 89 | do{ \ | 
|  | 90 | (set_)->__bits[0] = 0; \ | 
|  | 91 | }while(0) | 
|  | 92 |  | 
|  | 93 | #  define CPU_SET(cpu_,set_) \ | 
|  | 94 | do {\ | 
|  | 95 | size_t __cpu = (cpu_); \ | 
|  | 96 | if (__cpu < CPU_SETSIZE) \ | 
|  | 97 | (set_)->__bits[0] |= __CPU_MASK(__cpu); \ | 
|  | 98 | }while (0) | 
|  | 99 |  | 
|  | 100 | #  define CPU_CLR(cpu_,set_) \ | 
|  | 101 | do {\ | 
|  | 102 | size_t __cpu = (cpu_); \ | 
|  | 103 | if (__cpu < CPU_SETSIZE) \ | 
|  | 104 | (set_)->__bits[0] &= ~__CPU_MASK(__cpu); \ | 
|  | 105 | }while (0) | 
|  | 106 |  | 
|  | 107 | #  define CPU_ISSET(cpu_, set_) \ | 
|  | 108 | (__extension__({\ | 
|  | 109 | size_t  __cpu = (cpu_); \ | 
|  | 110 | (cpu_ < CPU_SETSIZE) \ | 
|  | 111 | ? ((set_)->__bits[0] & __CPU_MASK(__cpu)) != 0 \ | 
|  | 112 | : 0; \ | 
|  | 113 | })) | 
|  | 114 |  | 
|  | 115 | #  define CPU_EQUAL(set1_, set2_) \ | 
|  | 116 | ((set1_)->__bits[0] == (set2_)->__bits[0]) | 
|  | 117 |  | 
|  | 118 | #  define __CPU_OP(dst_, set1_, set2_, op_) \ | 
|  | 119 | do { \ | 
|  | 120 | (dst_)->__bits[0] = (set1_)->__bits[0] op_ (set2_)->__bits[0]; \ | 
|  | 121 | } while (0) | 
|  | 122 |  | 
|  | 123 | #  define CPU_COUNT(set_)  __builtin_popcountl((set_)->__bits[0]) | 
|  | 124 |  | 
|  | 125 | #else /* CPU_SETSIZE != __CPU_BITS */ | 
|  | 126 |  | 
|  | 127 | #  define CPU_ZERO(set_)          CPU_ZERO_S(sizeof(cpu_set_t), set_) | 
|  | 128 | #  define CPU_SET(cpu_,set_)      CPU_SET_S(cpu_,sizeof(cpu_set_t),set_) | 
|  | 129 | #  define CPU_CLR(cpu_,set_)      CPU_CLR_S(cpu_,sizeof(cpu_set_t),set_) | 
|  | 130 | #  define CPU_ISSET(cpu_,set_)    CPU_ISSET_S(cpu_,sizeof(cpu_set_t),set_) | 
|  | 131 | #  define CPU_COUNT(set_)         CPU_COUNT_S(sizeof(cpu_set_t),set_) | 
|  | 132 | #  define CPU_EQUAL(set1_,set2_)  CPU_EQUAL_S(sizeof(cpu_set_t),set1_,set2_) | 
|  | 133 |  | 
|  | 134 | #  define __CPU_OP(dst_,set1_,set2_,op_)  __CPU_OP_S(sizeof(cpu_set_t),dst_,set1_,set2_,op_) | 
|  | 135 |  | 
|  | 136 | #endif /* CPU_SETSIZE != __CPU_BITS */ | 
|  | 137 |  | 
|  | 138 | #define CPU_AND(set1_,set2_)   __CPU_OP(set1_,set2_,&) | 
|  | 139 | #define CPU_OR(set1_,set2_)    __CPU_OP(set1_,set2_,|) | 
|  | 140 | #define CPU_XOR(set1_,set2_)   __CPU_OP(set1_,set2_,^) | 
|  | 141 |  | 
|  | 142 | /* Support for dynamically-allocated cpu_set_t */ | 
|  | 143 |  | 
|  | 144 | #define CPU_ALLOC_SIZE(count) \ | 
|  | 145 | __CPU_ELT((count) + (__CPU_BITS-1))*sizeof(__CPU_BITTYPE) | 
|  | 146 |  | 
|  | 147 | #define CPU_ALLOC(count)   __sched_cpualloc((count)); | 
|  | 148 | #define CPU_FREE(set)      __sched_cpufree((set)) | 
|  | 149 |  | 
|  | 150 | extern cpu_set_t* __sched_cpualloc(size_t count); | 
|  | 151 | extern void       __sched_cpufree(cpu_set_t* set); | 
|  | 152 |  | 
|  | 153 | #define CPU_ZERO_S(setsize_,set_)  \ | 
|  | 154 | do { \ | 
|  | 155 | size_t __nn = 0; \ | 
|  | 156 | size_t __nn_max = (setsize_)/sizeof(__CPU_BITTYPE); \ | 
|  | 157 | for (; __nn < __nn_max; __nn++) \ | 
|  | 158 | (set_)->__bits[__nn] = 0; \ | 
|  | 159 | } while (0) | 
|  | 160 |  | 
|  | 161 | #define CPU_SET_S(cpu_,setsize_,set_) \ | 
|  | 162 | do { \ | 
|  | 163 | size_t __cpu = (cpu_); \ | 
|  | 164 | if (__cpu < 8*(setsize_)) \ | 
|  | 165 | (set_)->__bits[__CPU_ELT(__cpu)] |= __CPU_MASK(__cpu); \ | 
|  | 166 | } while (0) | 
|  | 167 |  | 
|  | 168 | #define CPU_CLR_S(cpu_,setsize_,set_) \ | 
|  | 169 | do { \ | 
|  | 170 | size_t __cpu = (cpu_); \ | 
|  | 171 | if (__cpu < 8*(setsize_)) \ | 
|  | 172 | (set_)->__bits[__CPU_ELT(__cpu)] &= ~__CPU_MASK(__cpu); \ | 
|  | 173 | } while (0) | 
|  | 174 |  | 
|  | 175 | #define CPU_ISSET_S(cpu_, setsize_, set_) \ | 
|  | 176 | (__extension__ ({ \ | 
|  | 177 | size_t __cpu = (cpu_); \ | 
|  | 178 | (__cpu < 8*(setsize_)) \ | 
|  | 179 | ? ((set_)->__bits[__CPU_ELT(__cpu)] & __CPU_MASK(__cpu)) != 0 \ | 
|  | 180 | : 0; \ | 
|  | 181 | })) | 
|  | 182 |  | 
|  | 183 | #define CPU_EQUAL_S(setsize_, set1_, set2_) \ | 
|  | 184 | (__extension__ ({ \ | 
|  | 185 | __const __CPU_BITTYPE* __src1 = (set1_)->__bits; \ | 
|  | 186 | __const __CPU_BITTYPE* __src2 = (set2_)->__bits; \ | 
|  | 187 | size_t __nn = 0, __nn_max = (setsize_)/sizeof(__CPU_BITTYPE); \ | 
|  | 188 | for (; __nn < __nn_max; __nn++) { \ | 
|  | 189 | if (__src1[__nn] != __src2[__nn]) \ | 
|  | 190 | break; \ | 
|  | 191 | } \ | 
|  | 192 | __nn == __nn_max; \ | 
|  | 193 | })) | 
|  | 194 |  | 
|  | 195 | #define __CPU_OP_S(setsize_, dstset_, srcset1_, srcset2_, op) \ | 
|  | 196 | do { \ | 
|  | 197 | cpu_set_t* __dst = (dstset); \ | 
|  | 198 | const __CPU_BITTYPE* __src1 = (srcset1)->__bits; \ | 
|  | 199 | const __CPU_BITTYPE* __src2 = (srcset2)->__bits; \ | 
|  | 200 | size_t __nn = 0, __nn_max = (setsize_)/sizeof(__CPU_BITTYPE); \ | 
|  | 201 | for (; __nn < __nn_max; __nn++) \ | 
|  | 202 | (__dst)->__bits[__nn] = __src1[__nn] op __src2[__nn]; \ | 
|  | 203 | } while (0) | 
|  | 204 |  | 
|  | 205 | #define CPU_COUNT_S(setsize_, set_) \ | 
|  | 206 | __sched_cpucount((setsize_), (set_)) | 
|  | 207 |  | 
|  | 208 | extern int __sched_cpucount(size_t setsize, cpu_set_t* set); | 
|  | 209 |  | 
|  | 210 | #endif /* _GNU_SOURCE */ | 
|  | 211 |  | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 212 | __END_DECLS | 
|  | 213 |  | 
|  | 214 | #endif /* _SCHED_H_ */ |