diff options
author | Zack Weinberg <zackw@panix.com> | 2017-05-20 18:23:01 -0400 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-06-12 17:11:36 -0400 |
commit | 46ee3da55ee36af9c930556ad4fca3f69434a067 (patch) | |
tree | b8dec7151e14b7ba37867a5a6a65c934255cfb64 | |
parent | 4bad368d9f13c2d8b8d2b2cea89a61916223d882 (diff) | |
download | glibc-46ee3da55ee36af9c930556ad4fca3f69434a067.tar.gz |
Remove __need_schedparam and __cpu_set_t_defined.
bits/sched.h has logic to expose only an impl-namespace variant of
struct sched_param (i.e. struct __sched_param), but nothing uses it,
and the only header that includes bits/sched.h is sched.h. The
__need_schedparam logic can therefore be removed.
bits/sched.h also has a great deal of code relating to cpu_set_t
objects that was *almost* the same between the two versions of
bits/sched.h in the tree; a little spelunking indicated that this is
because some bug fixes got applied to the Linux-specific bits/sched.h
but not the generic one. Introduce a new header, bits/cpu-set.h,
containing the version of that code with the bugfixes, have sched.h
include it directly, and delete all of the code from both versions of
bits/sched.h.
Also remove the unnecessary name mangling in the definition of struct
sched_param -- POSIX specifies a field 'sched_priority', so there is
no reason to define it as '__sched_priority' and then paper over that
with a macro. (Just in case someone was using the internal name,
'sched_priority' remains a macro defined to expand to itself, and
'__sched_priority' now expands to 'sched_priority'.)
Finally, as long as I'm touching these files anyway, merge new
constants from linux/sched.h into the Linux bits/sched.h.
* bits/sched.h: Remove __need_schedparam logic and replace with a
normal multiple-include guard. Change field name in struct
sched_param from __sched_priority to sched_priority. Delete
everything under #ifndef __cpu_set_t_defined.
* sysdeps/unix/sysv/linux/bits/sched.h: Likewise. Also sync with
kernel sched.h, adding SCHED_ISO and SCHED_DEADLINE constants.
* posix/sched.h: Include bits/cpu-set.h as well as bits/sched.h.
For compatibility, #define sched_priority to itself, and #define
__sched_priority as sched_priority.
* posix/bits/cpu-set.h: New file containing, verbatim, the code
that was under #ifndef __cpu_set_t_defined in
sysdeps/unix/sysv/linux/bits/sched.h.
* include/bits/cpu-set.h: New wrapper.
* posix/Makefile: Install bits/cpu-set.h.
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | bits/sched.h | 121 | ||||
-rw-r--r-- | include/bits/cpu-set.h | 1 | ||||
-rw-r--r-- | posix/Makefile | 4 | ||||
-rw-r--r-- | posix/bits/cpu-set.h | 124 | ||||
-rw-r--r-- | posix/sched.h | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/sched.h | 130 |
7 files changed, 163 insertions, 243 deletions
@@ -1,3 +1,21 @@ +2017-06-12 Zack Weinberg <zackw@panix.com> + + * bits/sched.h: Remove __need_schedparam logic and replace with a + normal multiple-include guard. Change field name in struct + sched_param from __sched_priority to sched_priority. Delete + everything under #ifndef __cpu_set_t_defined. + * sysdeps/unix/sysv/linux/bits/sched.h: Likewise. Also sync with + kernel sched.h, adding SCHED_ISO and SCHED_DEADLINE constants. + + * posix/sched.h: Include bits/cpu-set.h as well as bits/sched.h. + For compatibility, #define sched_priority to itself, and #define + __sched_priority as sched_priority. + * posix/bits/cpu-set.h: New file containing, verbatim, the code + that was under #ifndef __cpu_set_t_defined in + sysdeps/unix/sysv/linux/bits/sched.h. + * include/bits/cpu-set.h: New wrapper. + * posix/Makefile: Install bits/cpu-set.h. + 2017-06-12 Paul E. Murphy <murphyp@linux.vnet.ibm.com> Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com> Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> diff --git a/bits/sched.h b/bits/sched.h index c36c569db3..0588f3142e 100644 --- a/bits/sched.h +++ b/bits/sched.h @@ -17,13 +17,13 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#ifndef __need_schedparam +#ifndef _BITS_SCHED_H +#define _BITS_SCHED_H 1 #ifndef _SCHED_H # error "Never include <bits/sched.h> directly; use <sched.h> instead." #endif - /* Scheduling algorithms. */ #define SCHED_OTHER 0 #define SCHED_FIFO 1 @@ -32,120 +32,7 @@ /* Data structure to describe a process' schedulability. */ struct sched_param { - int __sched_priority; + int sched_priority; }; -#endif /* need schedparam */ - -#if !defined __defined_schedparam \ - && (defined __need_schedparam || defined _SCHED_H) -# define __defined_schedparam 1 -/* Data structure to describe a process' schedulability. */ -struct __sched_param - { - int __sched_priority; - }; -# undef __need_schedparam -#endif - - -#if defined _SCHED_H && !defined __cpu_set_t_defined -# define __cpu_set_t_defined -/* Size definition for CPU sets. */ -# define __CPU_SETSIZE 1024 -# define __NCPUBITS (8 * sizeof (__cpu_mask)) - -/* Type for array elements in 'cpu_set_t'. */ -typedef unsigned long int __cpu_mask; - -/* Basic access functions. */ -# define __CPUELT(cpu) ((cpu) / __NCPUBITS) -# define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS)) - -/* Data structure to describe CPU mask. */ -typedef struct -{ - __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS]; -} cpu_set_t; - -/* Access functions for CPU masks. */ -# if __GNUC_PREREQ (2, 91) -# define __CPU_ZERO_S(setsize, cpusetp) \ - do __builtin_memset (cpusetp, '\0', setsize); while (0) -# else -# define __CPU_ZERO_S(setsize, cpusetp) \ - do { \ - size_t __i; \ - size_t __imax = (setsize) / sizeof (__cpu_mask); \ - __cpu_mask *__bits = (cpusetp)->__bits; \ - for (__i = 0; __i < __imax; ++__i) \ - __bits[__i] = 0; \ - } while (0) -# endif -# define __CPU_SET_S(cpu, setsize, cpusetp) \ - (__extension__ \ - ({ size_t __cpu = (cpu); \ - __cpu < 8 * (setsize) \ - ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ - |= __CPUMASK (__cpu)) \ - : 0; })) -# define __CPU_CLR_S(cpu, setsize, cpusetp) \ - (__extension__ \ - ({ size_t __cpu = (cpu); \ - __cpu < 8 * (setsize) \ - ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ - &= ~__CPUMASK (__cpu)) \ - : 0; })) -# define __CPU_ISSET_S(cpu, setsize, cpusetp) \ - (__extension__ \ - ({ size_t __cpu = (cpu); \ - __cpu < 8 * (setsize) \ - ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ - & __CPUMASK (__cpu))) != 0 \ - : 0; })) - -# define __CPU_COUNT_S(setsize, cpusetp) \ - __sched_cpucount (setsize, cpusetp) - -# if __GNUC_PREREQ (2, 91) -# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ - (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0) -# else -# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ - (__extension__ \ - ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits; \ - const __cpu_mask *__arr2 = (cpusetp2)->__bits; \ - size_t __imax = (setsize) / sizeof (__cpu_mask); \ - size_t __i; \ - for (__i = 0; __i < __imax; ++__i) \ - if (__arr1[__i] != __arr2[__i]) \ - break; \ - __i == __imax; })) -# endif - -# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \ - (__extension__ \ - ({ cpu_set_t *__dest = (destset); \ - const __cpu_mask *__arr1 = (srcset1)->__bits; \ - const __cpu_mask *__arr2 = (srcset2)->__bits; \ - size_t __imax = (setsize) / sizeof (__cpu_mask); \ - size_t __i; \ - for (__i = 0; __i < __imax; ++__i) \ - ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \ - __dest; })) - -# define __CPU_ALLOC_SIZE(count) \ - ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask)) -# define __CPU_ALLOC(count) __sched_cpualloc (count) -# define __CPU_FREE(cpuset) __sched_cpufree (cpuset) - -__BEGIN_DECLS - -extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp) - __THROW; -extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur; -extern void __sched_cpufree (cpu_set_t *__set) __THROW; - -__END_DECLS - -#endif +#endif /* bits/sched.h */ diff --git a/include/bits/cpu-set.h b/include/bits/cpu-set.h new file mode 100644 index 0000000000..388f03cfbd --- /dev/null +++ b/include/bits/cpu-set.h @@ -0,0 +1 @@ +#include <posix/bits/cpu-set.h> diff --git a/posix/Makefile b/posix/Makefile index 52b022cf66..1c328b81af 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -30,8 +30,8 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \ bits/posix1_lim.h bits/posix2_lim.h bits/posix_opt.h \ bits/local_lim.h tar.h bits/utsname.h bits/confname.h \ bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h \ - bits/sched.h re_comp.h wait.h bits/environments.h cpio.h \ - spawn.h bits/unistd.h + bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h \ + cpio.h spawn.h bits/unistd.h routines := \ uname \ diff --git a/posix/bits/cpu-set.h b/posix/bits/cpu-set.h new file mode 100644 index 0000000000..f9b11b9714 --- /dev/null +++ b/posix/bits/cpu-set.h @@ -0,0 +1,124 @@ +/* Definition of the cpu_set_t structure used by the POSIX 1003.1b-1993 + scheduling interface. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _BITS_CPU_SET_H +#define _BITS_CPU_SET_H 1 + +#ifndef _SCHED_H +# error "Never include <bits/cpu-set.h> directly; use <sched.h> instead." +#endif + +/* Size definition for CPU sets. */ +# define __CPU_SETSIZE 1024 +# define __NCPUBITS (8 * sizeof (__cpu_mask)) + +/* Type for array elements in 'cpu_set_t'. */ +typedef __CPU_MASK_TYPE __cpu_mask; + +/* Basic access functions. */ +# define __CPUELT(cpu) ((cpu) / __NCPUBITS) +# define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS)) + +/* Data structure to describe CPU mask. */ +typedef struct +{ + __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS]; +} cpu_set_t; + +/* Access functions for CPU masks. */ +# if __GNUC_PREREQ (2, 91) +# define __CPU_ZERO_S(setsize, cpusetp) \ + do __builtin_memset (cpusetp, '\0', setsize); while (0) +# else +# define __CPU_ZERO_S(setsize, cpusetp) \ + do { \ + size_t __i; \ + size_t __imax = (setsize) / sizeof (__cpu_mask); \ + __cpu_mask *__bits = (cpusetp)->__bits; \ + for (__i = 0; __i < __imax; ++__i) \ + __bits[__i] = 0; \ + } while (0) +# endif +# define __CPU_SET_S(cpu, setsize, cpusetp) \ + (__extension__ \ + ({ size_t __cpu = (cpu); \ + __cpu / 8 < (setsize) \ + ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ + |= __CPUMASK (__cpu)) \ + : 0; })) +# define __CPU_CLR_S(cpu, setsize, cpusetp) \ + (__extension__ \ + ({ size_t __cpu = (cpu); \ + __cpu / 8 < (setsize) \ + ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ + &= ~__CPUMASK (__cpu)) \ + : 0; })) +# define __CPU_ISSET_S(cpu, setsize, cpusetp) \ + (__extension__ \ + ({ size_t __cpu = (cpu); \ + __cpu / 8 < (setsize) \ + ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ + & __CPUMASK (__cpu))) != 0 \ + : 0; })) + +# define __CPU_COUNT_S(setsize, cpusetp) \ + __sched_cpucount (setsize, cpusetp) + +# if __GNUC_PREREQ (2, 91) +# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ + (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0) +# else +# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ + (__extension__ \ + ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits; \ + const __cpu_mask *__arr2 = (cpusetp2)->__bits; \ + size_t __imax = (setsize) / sizeof (__cpu_mask); \ + size_t __i; \ + for (__i = 0; __i < __imax; ++__i) \ + if (__arr1[__i] != __arr2[__i]) \ + break; \ + __i == __imax; })) +# endif + +# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \ + (__extension__ \ + ({ cpu_set_t *__dest = (destset); \ + const __cpu_mask *__arr1 = (srcset1)->__bits; \ + const __cpu_mask *__arr2 = (srcset2)->__bits; \ + size_t __imax = (setsize) / sizeof (__cpu_mask); \ + size_t __i; \ + for (__i = 0; __i < __imax; ++__i) \ + ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \ + __dest; })) + +# define __CPU_ALLOC_SIZE(count) \ + ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask)) +# define __CPU_ALLOC(count) __sched_cpualloc (count) +# define __CPU_FREE(cpuset) __sched_cpufree (cpuset) + +__BEGIN_DECLS + +extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp) + __THROW; +extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur; +extern void __sched_cpufree (cpu_set_t *__set) __THROW; + +__END_DECLS + +#endif /* bits/cpu-set.h */ diff --git a/posix/sched.h b/posix/sched.h index 7037ab398d..d5cdac37b0 100644 --- a/posix/sched.h +++ b/posix/sched.h @@ -39,11 +39,13 @@ typedef __pid_t pid_t; # define __pid_t_defined #endif - /* Get system specific constant and data structure definitions. */ #include <bits/sched.h> -/* Define the real names for the elements of `struct sched_param'. */ -#define sched_priority __sched_priority +#include <bits/cpu-set.h> + +/* Backward compatibility. */ +#define sched_priority sched_priority +#define __sched_priority sched_priority __BEGIN_DECLS diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h index cc0d698f34..6d23e94ae6 100644 --- a/sysdeps/unix/sysv/linux/bits/sched.h +++ b/sysdeps/unix/sysv/linux/bits/sched.h @@ -17,20 +17,22 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#ifndef __need_schedparam +#ifndef _BITS_SCHED_H +#define _BITS_SCHED_H 1 #ifndef _SCHED_H # error "Never include <bits/sched.h> directly; use <sched.h> instead." #endif - /* Scheduling algorithms. */ #define SCHED_OTHER 0 #define SCHED_FIFO 1 #define SCHED_RR 2 #ifdef __USE_GNU # define SCHED_BATCH 3 +# define SCHED_ISO 4 # define SCHED_IDLE 5 +# define SCHED_DEADLINE 6 # define SCHED_RESET_ON_FORK 0x40000000 #endif @@ -69,11 +71,11 @@ # define CLONE_IO 0x80000000 /* Clone I/O context. */ #endif -/* The official definition. */ +/* Data structure to describe a process' schedulability. */ struct sched_param - { - int __sched_priority; - }; +{ + int sched_priority; +}; __BEGIN_DECLS @@ -92,120 +94,6 @@ extern int sched_getcpu (void) __THROW; extern int setns (int __fd, int __nstype) __THROW; #endif - -__END_DECLS - -#endif /* need schedparam */ - -#if !defined __defined_schedparam \ - && (defined __need_schedparam || defined _SCHED_H) -# define __defined_schedparam 1 -/* Data structure to describe a process' schedulability. */ -struct __sched_param - { - int __sched_priority; - }; -# undef __need_schedparam -#endif - - -#if defined _SCHED_H && !defined __cpu_set_t_defined -# define __cpu_set_t_defined -/* Size definition for CPU sets. */ -# define __CPU_SETSIZE 1024 -# define __NCPUBITS (8 * sizeof (__cpu_mask)) - -/* Type for array elements in 'cpu_set_t'. */ -typedef __CPU_MASK_TYPE __cpu_mask; - -/* Basic access functions. */ -# define __CPUELT(cpu) ((cpu) / __NCPUBITS) -# define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS)) - -/* Data structure to describe CPU mask. */ -typedef struct -{ - __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS]; -} cpu_set_t; - -/* Access functions for CPU masks. */ -# if __GNUC_PREREQ (2, 91) -# define __CPU_ZERO_S(setsize, cpusetp) \ - do __builtin_memset (cpusetp, '\0', setsize); while (0) -# else -# define __CPU_ZERO_S(setsize, cpusetp) \ - do { \ - size_t __i; \ - size_t __imax = (setsize) / sizeof (__cpu_mask); \ - __cpu_mask *__bits = (cpusetp)->__bits; \ - for (__i = 0; __i < __imax; ++__i) \ - __bits[__i] = 0; \ - } while (0) -# endif -# define __CPU_SET_S(cpu, setsize, cpusetp) \ - (__extension__ \ - ({ size_t __cpu = (cpu); \ - __cpu / 8 < (setsize) \ - ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ - |= __CPUMASK (__cpu)) \ - : 0; })) -# define __CPU_CLR_S(cpu, setsize, cpusetp) \ - (__extension__ \ - ({ size_t __cpu = (cpu); \ - __cpu / 8 < (setsize) \ - ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ - &= ~__CPUMASK (__cpu)) \ - : 0; })) -# define __CPU_ISSET_S(cpu, setsize, cpusetp) \ - (__extension__ \ - ({ size_t __cpu = (cpu); \ - __cpu / 8 < (setsize) \ - ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ - & __CPUMASK (__cpu))) != 0 \ - : 0; })) - -# define __CPU_COUNT_S(setsize, cpusetp) \ - __sched_cpucount (setsize, cpusetp) - -# if __GNUC_PREREQ (2, 91) -# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ - (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0) -# else -# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ - (__extension__ \ - ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits; \ - const __cpu_mask *__arr2 = (cpusetp2)->__bits; \ - size_t __imax = (setsize) / sizeof (__cpu_mask); \ - size_t __i; \ - for (__i = 0; __i < __imax; ++__i) \ - if (__arr1[__i] != __arr2[__i]) \ - break; \ - __i == __imax; })) -# endif - -# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \ - (__extension__ \ - ({ cpu_set_t *__dest = (destset); \ - const __cpu_mask *__arr1 = (srcset1)->__bits; \ - const __cpu_mask *__arr2 = (srcset2)->__bits; \ - size_t __imax = (setsize) / sizeof (__cpu_mask); \ - size_t __i; \ - for (__i = 0; __i < __imax; ++__i) \ - ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \ - __dest; })) - -# define __CPU_ALLOC_SIZE(count) \ - ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask)) -# define __CPU_ALLOC(count) __sched_cpualloc (count) -# define __CPU_FREE(cpuset) __sched_cpufree (cpuset) - -__BEGIN_DECLS - -extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp) - __THROW; -extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur; -extern void __sched_cpufree (cpu_set_t *__set) __THROW; - __END_DECLS -#endif +#endif /* bits/sched.h */ |