Synchronize generic bits/sched.h cpu_set_t with Linux implementation.
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 7 Feb 2011 18:53:37 +0000 (10:53 -0800)
committerRoland McGrath <roland@redhat.com>
Mon, 7 Feb 2011 18:53:37 +0000 (10:53 -0800)
ChangeLog
bits/sched.h

index 8d91be9..ffc37f0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2011-01-30  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+        This brings the variable-size cpu_set_t manipulation macros from
+        ./sysdeps/unix/sysv/linux/bits/sched.h
+        * bits/sched.h (__CPU_ZERO, __CPU_SET, __CPU_CLR, __CPU_ISSET,
+        __CPU_COUNT): Remove old macros.
+        (__CPU_ZERO_S, __CPU_SET_S, __CPU_CLR_S, __CPU_ISSET_S,
+        __CPU_COUNT, __CPU_EQUAL_S, __CPU_OP_S, __CPU_ALLOC_SIZE,
+        __CPU_ALLOC, __CPU_FREE): Add macros.
+       (__sched_cpualloc, __sched_cpufree): Add declarations.
+
 2011-02-05  Ulrich Drepper  <drepper@gmail.com>
 
        * nscd/nscd-client.h: Define MAX_TIMEOUT_VALUE.
index a068e50..9a22ae3 100644 (file)
@@ -1,6 +1,7 @@
 /* Definitions of constants and data structure for POSIX 1003.1b-1993
    scheduling interface.
-   Copyright (C) 1996, 1997, 2001, 2003, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1996-1999,2001-2003,2005,2006,2007,2008,2009
+   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
@@ -56,7 +57,7 @@ struct __sched_param
 # define __CPU_SETSIZE 1024
 # define __NCPUBITS    (8 * sizeof (__cpu_mask))
 
-/* Type for array elements in 'cpu_set'.  */
+/* Type for array elements in 'cpu_set_t'.  */
 typedef unsigned long int __cpu_mask;
 
 /* Basic access functions.  */
@@ -70,27 +71,83 @@ typedef struct
 } cpu_set_t;
 
 /* Access functions for CPU masks.  */
-# define __CPU_ZERO(cpusetp) \
+# 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 {                                                                       \
-    unsigned int __i;                                                        \
-    cpu_set *__arr = (cpusetp);                                                      \
-    for (__i = 0; __i < sizeof (cpu_set) / sizeof (__cpu_mask); ++__i)       \
-      __arr->__bits[__i] = 0;                                                \
+    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)
-# define __CPU_SET(cpu, cpusetp) \
-  ((cpusetp)->__bits[__CPUELT (cpu)] |= __CPUMASK (cpu))
-# define __CPU_CLR(cpu, cpusetp) \
-  ((cpusetp)->__bits[__CPUELT (cpu)] &= ~__CPUMASK (cpu))
-# define __CPU_ISSET(cpu, cpusetp) \
-  (((cpusetp)->__bits[__CPUELT (cpu)] & __CPUMASK (cpu)) != 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 (__bits[__i] != __bits[__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
 
-# define __CPU_COUNT(cpusetp) \
-  __sched_cpucount (sizeof (cpu_set_t), cpusetp)
 #endif