diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2023-08-30 11:32:02 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2023-09-01 12:43:36 +0200 |
commit | 797d1bbd2e115872df10cf1c15ccc6cfc99648d6 (patch) | |
tree | 1f187ba5abc4a879ffa3dda371e74ebda37062e8 | |
parent | 930f210b21c59298944f237002c36db0b990a4d9 (diff) | |
download | newlib-797d1bbd2e115872df10cf1c15ccc6cfc99648d6.zip newlib-797d1bbd2e115872df10cf1c15ccc6cfc99648d6.tar.gz newlib-797d1bbd2e115872df10cf1c15ccc6cfc99648d6.tar.bz2 |
Cygwin: sys/cpuset.h: add cpuset-specific external functions
The latest incarnation of sys/cpuset.h broke building coreutils.
The reason is the inclusion of stdlib.h and string.h and hence
premature requests for datatypes not yet defined in the include
chain.
Avoid this by defining __cpuset_alloc and __cpuset_free as external
functions, now defined in sched.cc. Linux is doing this too, just
using different names for the functions. Redefine __cpuset_zero_s
to use __builtin_memset only on compilers supporting it, otherwise
using a simple loop. Drop the stdlib.h and string.h includes.
Fixes: 3f2790e04439 ("Cygwin: Make gcc-specific code in <sys/cpuset.h> compiler-agnostic")
Reported-by: Denis Excoffier <cygwin@Denis-Excoffier.org>
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/cygwin.din | 2 | ||||
-rw-r--r-- | winsup/cygwin/include/sys/cpuset.h | 25 | ||||
-rw-r--r-- | winsup/cygwin/sched.cc | 12 |
3 files changed, 25 insertions, 14 deletions
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index c6768e4..be40426 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -49,6 +49,8 @@ __b64_ntop NOSIGFE __b64_pton NOSIGFE __bsd_qsort_r NOSIGFE __chk_fail SIGFE +__cpuset_alloc SIGFE +__cpuset_free SIGFE __cxa_atexit = cygwin__cxa_atexit SIGFE __cxa_finalize SIGFE __dn_comp SIGFE diff --git a/winsup/cygwin/include/sys/cpuset.h b/winsup/cygwin/include/sys/cpuset.h index 95c777c..2ab2b95 100644 --- a/winsup/cygwin/include/sys/cpuset.h +++ b/winsup/cygwin/include/sys/cpuset.h @@ -9,8 +9,7 @@ details. */ #ifndef _SYS_CPUSET_H_ #define _SYS_CPUSET_H_ -#include <stdlib.h> -#include <string.h> +#include <sys/features.h> #ifdef __cplusplus extern "C" { @@ -42,25 +41,23 @@ __cpuset_alloc_size (int num) } #define CPU_ALLOC(num) __cpuset_alloc (num) -static __inline cpu_set_t * -__cpuset_alloc (int num) -{ - return (cpu_set_t *) malloc (CPU_ALLOC_SIZE(num)); -} +extern cpu_set_t * __cpuset_alloc (int); #define CPU_FREE(set) __cpuset_free (set) -static __inline void -__cpuset_free (cpu_set_t *set) -{ - free (set); -} +void __cpuset_free (cpu_set_t *); /* These _S macros operate on dynamically-sized cpu sets of size 'siz' bytes */ #define CPU_ZERO_S(siz, set) __cpuset_zero_s (siz, set) -static __inline void +static __inline __cpuset_zero_s (size_t siz, cpu_set_t *set) { - (void) memset (set, 0, siz); +#if __GNUC_PREREQ (2, 91) + __builtin_memset (set, 0, siz); +#else + siz /= sizeof (__cpu_mask); + while (siz > 0) + set->_bits[--siz] = 0; +#endif } #define CPU_SET_S(cpu, siz, set) __cpuset_set_s (cpu, siz, set) diff --git a/winsup/cygwin/sched.cc b/winsup/cygwin/sched.cc index d7bad85..845fcef 100644 --- a/winsup/cygwin/sched.cc +++ b/winsup/cygwin/sched.cc @@ -684,4 +684,16 @@ done: return 0; } +cpu_set_t * +__cpuset_alloc (int num) +{ + return (cpu_set_t *) malloc (CPU_ALLOC_SIZE(num)); +} + +void +__cpuset_free (cpu_set_t *set) +{ + free (set); +} + } /* extern C */ |