11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _SCHED_H_ 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _SCHED_H_ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/time.h> 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SCHED_NORMAL 0 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SCHED_OTHER 0 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SCHED_FIFO 1 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SCHED_RR 2 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct sched_param { 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int sched_priority; 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_setscheduler(pid_t, int, const struct sched_param *); 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_getscheduler(pid_t); 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_yield(void); 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_get_priority_max(int policy); 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_get_priority_min(int policy); 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_setparam(pid_t, const struct sched_param *); 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_getparam(pid_t, struct sched_param *); 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sched_rr_get_interval(pid_t pid, struct timespec *tp); 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_VM 0x00000100 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_FS 0x00000200 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_FILES 0x00000400 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_SIGHAND 0x00000800 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_PTRACE 0x00002000 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_VFORK 0x00004000 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_PARENT 0x00008000 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_THREAD 0x00010000 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_NEWNS 0x00020000 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_SYSVSEM 0x00040000 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_SETTLS 0x00080000 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_PARENT_SETTID 0x00100000 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_CHILD_CLEARTID 0x00200000 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_DETACHED 0x00400000 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_UNTRACED 0x00800000 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_CHILD_SETTID 0x01000000 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define CLONE_STOPPED 0x02000000 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 72bb5581ad6eec40041dab4e961149f7a8a3a83497David 'Digit' Turner#ifdef _GNU_SOURCE 7397cf7f3394780d524038fc083e2c134031b54728David 'Digit' Turnerextern int clone(int (*fn)(void *), void *child_stack, int flags, void* arg, ...); 7482393decdfc6b0383054fb5d2f54725bbee88b8cJeff Sharkeyextern int unshare(int); 7597cf7f3394780d524038fc083e2c134031b54728David 'Digit' Turner#endif 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner/* Support for cpu thread affinity */ 7872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#ifdef _GNU_SOURCE 7972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 8072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnerextern int sched_getcpu(void); 8172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 8272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 8372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner/* Our implementation supports up to 32 independent CPUs, which is also 8472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner * the maximum supported by the kernel at the moment. GLibc uses 1024 by 8572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner * default. 8672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner * 8772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner * If you want to use more than that, you should use CPU_ALLOC() / CPU_FREE() 8872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner * and the CPU_XXX_S() macro variants. 8972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner */ 9072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_SETSIZE 32 9172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 9272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define __CPU_BITTYPE unsigned long int /* mandated by the kernel */ 9372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define __CPU_BITSHIFT 5 /* should be log2(BITTYPE) */ 9472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define __CPU_BITS (1 << __CPU_BITSHIFT) 9572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define __CPU_ELT(x) ((x) >> __CPU_BITSHIFT) 9672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define __CPU_MASK(x) ((__CPU_BITTYPE)1 << ((x) & (__CPU_BITS-1))) 9772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 9872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnertypedef struct { 9972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner __CPU_BITTYPE __bits[ CPU_SETSIZE / __CPU_BITS ]; 10072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner} cpu_set_t; 10172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 10272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnerextern int sched_setaffinity(pid_t pid, size_t setsize, const cpu_set_t* set); 10372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 10472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnerextern int sched_getaffinity(pid_t pid, size_t setsize, cpu_set_t* set); 10572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 10672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner/* Provide optimized implementation for 32-bit cpu_set_t */ 10772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#if CPU_SETSIZE == __CPU_BITS 10872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 10972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_ZERO(set_) \ 11072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do{ \ 11172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (set_)->__bits[0] = 0; \ 11272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner }while(0) 11372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 11472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_SET(cpu_,set_) \ 11572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do {\ 11672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __cpu = (cpu_); \ 11772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner if (__cpu < CPU_SETSIZE) \ 11872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (set_)->__bits[0] |= __CPU_MASK(__cpu); \ 11972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner }while (0) 12072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 12172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_CLR(cpu_,set_) \ 12272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do {\ 12372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __cpu = (cpu_); \ 12472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner if (__cpu < CPU_SETSIZE) \ 12572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (set_)->__bits[0] &= ~__CPU_MASK(__cpu); \ 12672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner }while (0) 12772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 12872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_ISSET(cpu_, set_) \ 12972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (__extension__({\ 13072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __cpu = (cpu_); \ 13172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (cpu_ < CPU_SETSIZE) \ 13272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner ? ((set_)->__bits[0] & __CPU_MASK(__cpu)) != 0 \ 13372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner : 0; \ 13472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner })) 13572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 13672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_EQUAL(set1_, set2_) \ 13772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner ((set1_)->__bits[0] == (set2_)->__bits[0]) 13872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 13972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define __CPU_OP(dst_, set1_, set2_, op_) \ 14072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do { \ 14172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (dst_)->__bits[0] = (set1_)->__bits[0] op_ (set2_)->__bits[0]; \ 14272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner } while (0) 14372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 14472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_COUNT(set_) __builtin_popcountl((set_)->__bits[0]) 14572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 14672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#else /* CPU_SETSIZE != __CPU_BITS */ 14772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 14872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_ZERO(set_) CPU_ZERO_S(sizeof(cpu_set_t), set_) 14972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_SET(cpu_,set_) CPU_SET_S(cpu_,sizeof(cpu_set_t),set_) 15072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_CLR(cpu_,set_) CPU_CLR_S(cpu_,sizeof(cpu_set_t),set_) 15172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_ISSET(cpu_,set_) CPU_ISSET_S(cpu_,sizeof(cpu_set_t),set_) 15272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_COUNT(set_) CPU_COUNT_S(sizeof(cpu_set_t),set_) 15372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define CPU_EQUAL(set1_,set2_) CPU_EQUAL_S(sizeof(cpu_set_t),set1_,set2_) 15472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 15572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner# define __CPU_OP(dst_,set1_,set2_,op_) __CPU_OP_S(sizeof(cpu_set_t),dst_,set1_,set2_,op_) 15672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 15772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#endif /* CPU_SETSIZE != __CPU_BITS */ 15872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 15972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_AND(set1_,set2_) __CPU_OP(set1_,set2_,&) 16072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_OR(set1_,set2_) __CPU_OP(set1_,set2_,|) 16172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_XOR(set1_,set2_) __CPU_OP(set1_,set2_,^) 16272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 16372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner/* Support for dynamically-allocated cpu_set_t */ 16472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 16572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_ALLOC_SIZE(count) \ 16672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner __CPU_ELT((count) + (__CPU_BITS-1))*sizeof(__CPU_BITTYPE) 16772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 16872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_ALLOC(count) __sched_cpualloc((count)); 16972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_FREE(set) __sched_cpufree((set)) 17072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 17172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnerextern cpu_set_t* __sched_cpualloc(size_t count); 17272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnerextern void __sched_cpufree(cpu_set_t* set); 17372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 17472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_ZERO_S(setsize_,set_) \ 17572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do { \ 17672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __nn = 0; \ 17772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __nn_max = (setsize_)/sizeof(__CPU_BITTYPE); \ 17872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner for (; __nn < __nn_max; __nn++) \ 17972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (set_)->__bits[__nn] = 0; \ 18072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner } while (0) 18172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 18272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_SET_S(cpu_,setsize_,set_) \ 18372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do { \ 18472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __cpu = (cpu_); \ 18572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner if (__cpu < 8*(setsize_)) \ 18672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (set_)->__bits[__CPU_ELT(__cpu)] |= __CPU_MASK(__cpu); \ 18772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner } while (0) 18872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 18972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_CLR_S(cpu_,setsize_,set_) \ 19072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do { \ 19172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __cpu = (cpu_); \ 19272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner if (__cpu < 8*(setsize_)) \ 19372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (set_)->__bits[__CPU_ELT(__cpu)] &= ~__CPU_MASK(__cpu); \ 19472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner } while (0) 19572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 19672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_ISSET_S(cpu_, setsize_, set_) \ 19772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (__extension__ ({ \ 19872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __cpu = (cpu_); \ 19972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (__cpu < 8*(setsize_)) \ 20072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner ? ((set_)->__bits[__CPU_ELT(__cpu)] & __CPU_MASK(__cpu)) != 0 \ 20172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner : 0; \ 20272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner })) 20372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 20472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_EQUAL_S(setsize_, set1_, set2_) \ 20572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (__extension__ ({ \ 20672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner __const __CPU_BITTYPE* __src1 = (set1_)->__bits; \ 20772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner __const __CPU_BITTYPE* __src2 = (set2_)->__bits; \ 20872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __nn = 0, __nn_max = (setsize_)/sizeof(__CPU_BITTYPE); \ 20972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner for (; __nn < __nn_max; __nn++) { \ 21072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner if (__src1[__nn] != __src2[__nn]) \ 21172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner break; \ 21272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner } \ 21372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner __nn == __nn_max; \ 21472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner })) 21572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 21672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define __CPU_OP_S(setsize_, dstset_, srcset1_, srcset2_, op) \ 21772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner do { \ 21872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner cpu_set_t* __dst = (dstset); \ 21972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner const __CPU_BITTYPE* __src1 = (srcset1)->__bits; \ 22072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner const __CPU_BITTYPE* __src2 = (srcset2)->__bits; \ 22172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner size_t __nn = 0, __nn_max = (setsize_)/sizeof(__CPU_BITTYPE); \ 22272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner for (; __nn < __nn_max; __nn++) \ 22372e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner (__dst)->__bits[__nn] = __src1[__nn] op __src2[__nn]; \ 22472e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner } while (0) 22572e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 22672e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#define CPU_COUNT_S(setsize_, set_) \ 22772e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner __sched_cpucount((setsize_), (set_)) 22872e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 22972e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turnerextern int __sched_cpucount(size_t setsize, cpu_set_t* set); 23072e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 23172e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner#endif /* _GNU_SOURCE */ 23272e6fd42421dca80fb2776a9185c186d4a04e5f7David 'Digit' Turner 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SCHED_H_ */ 236