text: /* Definition of the cpu_set_t structure used by the POSIX 1003.1b-1993
     scheduling interface.
     Copyright (C) 1996-2018 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 */
  