1*53ee8cc1Swenshuai.xi /* Definitions of constants and data structure for POSIX 1003.1b-1993 2*53ee8cc1Swenshuai.xi scheduling interface. 3*53ee8cc1Swenshuai.xi Copyright (C) 1996-1999,2001-2003,2005,2006,2007 4*53ee8cc1Swenshuai.xi Free Software Foundation, Inc. 5*53ee8cc1Swenshuai.xi This file is part of the GNU C Library. 6*53ee8cc1Swenshuai.xi 7*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or 8*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public 9*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either 10*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version. 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful, 13*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of 14*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15*53ee8cc1Swenshuai.xi Lesser General Public License for more details. 16*53ee8cc1Swenshuai.xi 17*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public 18*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free 19*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 20*53ee8cc1Swenshuai.xi 02111-1307 USA. */ 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xi #ifndef __need_schedparam 23*53ee8cc1Swenshuai.xi 24*53ee8cc1Swenshuai.xi #ifndef _SCHED_H 25*53ee8cc1Swenshuai.xi # error "Never include <bits/sched.h> directly; use <sched.h> instead." 26*53ee8cc1Swenshuai.xi #endif 27*53ee8cc1Swenshuai.xi 28*53ee8cc1Swenshuai.xi 29*53ee8cc1Swenshuai.xi /* Scheduling algorithms. */ 30*53ee8cc1Swenshuai.xi #define SCHED_OTHER 0 31*53ee8cc1Swenshuai.xi #define SCHED_FIFO 1 32*53ee8cc1Swenshuai.xi #define SCHED_RR 2 33*53ee8cc1Swenshuai.xi #ifdef __USE_GNU 34*53ee8cc1Swenshuai.xi # define SCHED_BATCH 3 35*53ee8cc1Swenshuai.xi #endif 36*53ee8cc1Swenshuai.xi 37*53ee8cc1Swenshuai.xi #ifdef __USE_MISC 38*53ee8cc1Swenshuai.xi /* Cloning flags. */ 39*53ee8cc1Swenshuai.xi # define CSIGNAL 0x000000ff /* Signal mask to be sent at exit. */ 40*53ee8cc1Swenshuai.xi # define CLONE_VM 0x00000100 /* Set if VM shared between processes. */ 41*53ee8cc1Swenshuai.xi # define CLONE_FS 0x00000200 /* Set if fs info shared between processes. */ 42*53ee8cc1Swenshuai.xi # define CLONE_FILES 0x00000400 /* Set if open files shared between processes. */ 43*53ee8cc1Swenshuai.xi # define CLONE_SIGHAND 0x00000800 /* Set if signal handlers shared. */ 44*53ee8cc1Swenshuai.xi # define CLONE_PTRACE 0x00002000 /* Set if tracing continues on the child. */ 45*53ee8cc1Swenshuai.xi # define CLONE_VFORK 0x00004000 /* Set if the parent wants the child to 46*53ee8cc1Swenshuai.xi wake it up on mm_release. */ 47*53ee8cc1Swenshuai.xi # define CLONE_PARENT 0x00008000 /* Set if we want to have the same 48*53ee8cc1Swenshuai.xi parent as the cloner. */ 49*53ee8cc1Swenshuai.xi # define CLONE_THREAD 0x00010000 /* Set to add to same thread group. */ 50*53ee8cc1Swenshuai.xi # define CLONE_NEWNS 0x00020000 /* Set to create new namespace. */ 51*53ee8cc1Swenshuai.xi # define CLONE_SYSVSEM 0x00040000 /* Set to shared SVID SEM_UNDO semantics. */ 52*53ee8cc1Swenshuai.xi # define CLONE_SETTLS 0x00080000 /* Set TLS info. */ 53*53ee8cc1Swenshuai.xi # define CLONE_PARENT_SETTID 0x00100000 /* Store TID in userlevel buffer 54*53ee8cc1Swenshuai.xi before MM copy. */ 55*53ee8cc1Swenshuai.xi # define CLONE_CHILD_CLEARTID 0x00200000 /* Register exit futex and memory 56*53ee8cc1Swenshuai.xi location to clear. */ 57*53ee8cc1Swenshuai.xi # define CLONE_DETACHED 0x00400000 /* Create clone detached. */ 58*53ee8cc1Swenshuai.xi # define CLONE_UNTRACED 0x00800000 /* Set if the tracing process can't 59*53ee8cc1Swenshuai.xi force CLONE_PTRACE on this clone. */ 60*53ee8cc1Swenshuai.xi # define CLONE_CHILD_SETTID 0x01000000 /* Store TID in userlevel buffer in 61*53ee8cc1Swenshuai.xi the child. */ 62*53ee8cc1Swenshuai.xi # define CLONE_NEWUTS 0x04000000 /* New utsname group. */ 63*53ee8cc1Swenshuai.xi # define CLONE_NEWIPC 0x08000000 /* New ipcs. */ 64*53ee8cc1Swenshuai.xi # define CLONE_NEWUSER 0x10000000 /* New user namespace. */ 65*53ee8cc1Swenshuai.xi # define CLONE_NEWPID 0x20000000 /* New pid namespace. */ 66*53ee8cc1Swenshuai.xi # define CLONE_NEWNET 0x40000000 /* New network namespace. */ 67*53ee8cc1Swenshuai.xi # define CLONE_IO 0x80000000 /* Clone I/O context. */ 68*53ee8cc1Swenshuai.xi #endif 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi /* The official definition. */ 71*53ee8cc1Swenshuai.xi struct sched_param 72*53ee8cc1Swenshuai.xi { 73*53ee8cc1Swenshuai.xi int __sched_priority; 74*53ee8cc1Swenshuai.xi }; 75*53ee8cc1Swenshuai.xi 76*53ee8cc1Swenshuai.xi __BEGIN_DECLS 77*53ee8cc1Swenshuai.xi 78*53ee8cc1Swenshuai.xi #ifdef __USE_MISC 79*53ee8cc1Swenshuai.xi /* Clone current process. */ 80*53ee8cc1Swenshuai.xi extern int clone (int (*__fn) (void *__arg), void *__child_stack, 81*53ee8cc1Swenshuai.xi int __flags, void *__arg, ...) __THROW; 82*53ee8cc1Swenshuai.xi 83*53ee8cc1Swenshuai.xi /* Unshare the specified resources. */ 84*53ee8cc1Swenshuai.xi extern int unshare (int __flags) __THROW; 85*53ee8cc1Swenshuai.xi 86*53ee8cc1Swenshuai.xi /* Get index of currently used CPU. */ 87*53ee8cc1Swenshuai.xi extern int sched_getcpu (void) __THROW; 88*53ee8cc1Swenshuai.xi #endif 89*53ee8cc1Swenshuai.xi 90*53ee8cc1Swenshuai.xi __END_DECLS 91*53ee8cc1Swenshuai.xi 92*53ee8cc1Swenshuai.xi #endif /* need schedparam */ 93*53ee8cc1Swenshuai.xi 94*53ee8cc1Swenshuai.xi #if !defined __defined_schedparam \ 95*53ee8cc1Swenshuai.xi && (defined __need_schedparam || defined _SCHED_H) 96*53ee8cc1Swenshuai.xi # define __defined_schedparam 1 97*53ee8cc1Swenshuai.xi /* Data structure to describe a process' schedulability. */ 98*53ee8cc1Swenshuai.xi struct __sched_param 99*53ee8cc1Swenshuai.xi { 100*53ee8cc1Swenshuai.xi int __sched_priority; 101*53ee8cc1Swenshuai.xi }; 102*53ee8cc1Swenshuai.xi # undef __need_schedparam 103*53ee8cc1Swenshuai.xi #endif 104*53ee8cc1Swenshuai.xi 105*53ee8cc1Swenshuai.xi 106*53ee8cc1Swenshuai.xi #if defined _SCHED_H && !defined __cpu_set_t_defined 107*53ee8cc1Swenshuai.xi # define __cpu_set_t_defined 108*53ee8cc1Swenshuai.xi /* Size definition for CPU sets. */ 109*53ee8cc1Swenshuai.xi # define __CPU_SETSIZE 1024 110*53ee8cc1Swenshuai.xi # define __NCPUBITS (8 * sizeof (__cpu_mask)) 111*53ee8cc1Swenshuai.xi 112*53ee8cc1Swenshuai.xi /* Type for array elements in 'cpu_set_t'. */ 113*53ee8cc1Swenshuai.xi typedef unsigned long int __cpu_mask; 114*53ee8cc1Swenshuai.xi 115*53ee8cc1Swenshuai.xi /* Basic access functions. */ 116*53ee8cc1Swenshuai.xi # define __CPUELT(cpu) ((cpu) / __NCPUBITS) 117*53ee8cc1Swenshuai.xi # define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS)) 118*53ee8cc1Swenshuai.xi 119*53ee8cc1Swenshuai.xi /* Data structure to describe CPU mask. */ 120*53ee8cc1Swenshuai.xi typedef struct 121*53ee8cc1Swenshuai.xi { 122*53ee8cc1Swenshuai.xi __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS]; 123*53ee8cc1Swenshuai.xi } cpu_set_t; 124*53ee8cc1Swenshuai.xi 125*53ee8cc1Swenshuai.xi /* Access functions for CPU masks. */ 126*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (2, 91) 127*53ee8cc1Swenshuai.xi # define __CPU_ZERO_S(setsize, cpusetp) \ 128*53ee8cc1Swenshuai.xi do __builtin_memset (cpusetp, '\0', setsize); while (0) 129*53ee8cc1Swenshuai.xi # else 130*53ee8cc1Swenshuai.xi # define __CPU_ZERO_S(setsize, cpusetp) \ 131*53ee8cc1Swenshuai.xi do { \ 132*53ee8cc1Swenshuai.xi size_t __i; \ 133*53ee8cc1Swenshuai.xi size_t __imax = (setsize) / sizeof (__cpu_mask); \ 134*53ee8cc1Swenshuai.xi cpu_set_t *__arr = (cpusetp); \ 135*53ee8cc1Swenshuai.xi for (__i = 0; __i < __imax; ++__i) \ 136*53ee8cc1Swenshuai.xi __arr->__bits[__i] = 0; \ 137*53ee8cc1Swenshuai.xi } while (0) 138*53ee8cc1Swenshuai.xi # endif 139*53ee8cc1Swenshuai.xi # define __CPU_SET_S(cpu, setsize, cpusetp) \ 140*53ee8cc1Swenshuai.xi (__extension__ \ 141*53ee8cc1Swenshuai.xi ({ size_t __cpu = (cpu); \ 142*53ee8cc1Swenshuai.xi __cpu < 8 * (setsize) \ 143*53ee8cc1Swenshuai.xi ? ((cpusetp)->__bits[__CPUELT (__cpu)] |= __CPUMASK (__cpu)) : 0; })) 144*53ee8cc1Swenshuai.xi # define __CPU_CLR_S(cpu, setsize, cpusetp) \ 145*53ee8cc1Swenshuai.xi (__extension__ \ 146*53ee8cc1Swenshuai.xi ({ size_t __cpu = (cpu); \ 147*53ee8cc1Swenshuai.xi __cpu < 8 * (setsize) \ 148*53ee8cc1Swenshuai.xi ? ((cpusetp)->__bits[__CPUELT (__cpu)] &= ~__CPUMASK (__cpu)) : 0; })) 149*53ee8cc1Swenshuai.xi # define __CPU_ISSET_S(cpu, setsize, cpusetp) \ 150*53ee8cc1Swenshuai.xi (__extension__ \ 151*53ee8cc1Swenshuai.xi ({ size_t __cpu = (cpu); \ 152*53ee8cc1Swenshuai.xi __cpu < 8 * (setsize) \ 153*53ee8cc1Swenshuai.xi ? (((cpusetp)->__bits[__CPUELT (__cpu)] & __CPUMASK (__cpu))) != 0 \ 154*53ee8cc1Swenshuai.xi : 0; })) 155*53ee8cc1Swenshuai.xi 156*53ee8cc1Swenshuai.xi # define __CPU_COUNT_S(setsize, cpusetp) \ 157*53ee8cc1Swenshuai.xi __sched_cpucount (setsize, cpusetp) 158*53ee8cc1Swenshuai.xi 159*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (2, 91) 160*53ee8cc1Swenshuai.xi # define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ 161*53ee8cc1Swenshuai.xi (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0) 162*53ee8cc1Swenshuai.xi # else 163*53ee8cc1Swenshuai.xi # define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ 164*53ee8cc1Swenshuai.xi (__extension__ \ 165*53ee8cc1Swenshuai.xi ({ cpu_set_t *__arr1 = (cpusetp1); \ 166*53ee8cc1Swenshuai.xi cpu_set_t *__arr2 = (cpusetp2); \ 167*53ee8cc1Swenshuai.xi size_t __imax = (setsize) / sizeof (__cpu_mask); \ 168*53ee8cc1Swenshuai.xi size_t __i; \ 169*53ee8cc1Swenshuai.xi for (__i = 0; __i < __imax; ++__i) \ 170*53ee8cc1Swenshuai.xi if (__arr1->__bits[__i] != __arr2->__bits[__i]) \ 171*53ee8cc1Swenshuai.xi break; \ 172*53ee8cc1Swenshuai.xi __i == __imax; })) 173*53ee8cc1Swenshuai.xi # endif 174*53ee8cc1Swenshuai.xi 175*53ee8cc1Swenshuai.xi # define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \ 176*53ee8cc1Swenshuai.xi (__extension__ \ 177*53ee8cc1Swenshuai.xi ({ cpu_set_t *__dest = (destset); \ 178*53ee8cc1Swenshuai.xi cpu_set_t *__arr1 = (srcset1); \ 179*53ee8cc1Swenshuai.xi cpu_set_t *__arr2 = (srcset2); \ 180*53ee8cc1Swenshuai.xi size_t __imax = (setsize) / sizeof (__cpu_mask); \ 181*53ee8cc1Swenshuai.xi size_t __i; \ 182*53ee8cc1Swenshuai.xi for (__i = 0; __i < __imax; ++__i) \ 183*53ee8cc1Swenshuai.xi __dest->__bits[__i] = __arr1->__bits[__i] op __arr2->__bits[__i]; \ 184*53ee8cc1Swenshuai.xi __dest; })) 185*53ee8cc1Swenshuai.xi 186*53ee8cc1Swenshuai.xi # define __CPU_ALLOC_SIZE(count) \ 187*53ee8cc1Swenshuai.xi ((((count) + __NCPUBITS - 1) / __NCPUBITS) * 8) 188*53ee8cc1Swenshuai.xi # define __CPU_ALLOC(count) __sched_cpualloc (count) 189*53ee8cc1Swenshuai.xi # define __CPU_FREE(cpuset) __sched_cpufree (cpuset) 190*53ee8cc1Swenshuai.xi 191*53ee8cc1Swenshuai.xi __BEGIN_DECLS 192*53ee8cc1Swenshuai.xi 193*53ee8cc1Swenshuai.xi extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp) 194*53ee8cc1Swenshuai.xi __THROW; 195*53ee8cc1Swenshuai.xi extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur; 196*53ee8cc1Swenshuai.xi extern void __sched_cpufree (cpu_set_t *__set) __THROW; 197*53ee8cc1Swenshuai.xi 198*53ee8cc1Swenshuai.xi __END_DECLS 199*53ee8cc1Swenshuai.xi 200*53ee8cc1Swenshuai.xi #endif 201