mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
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.zack/errno-prettyprint
7 changed files with 163 additions and 243 deletions
@ -0,0 +1 @@ |
|||
#include <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 */ |
|||
Loading…
Reference in new issue