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