162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1
262306a36Sopenharmony_ci// Definitions taken from glibc for use with older systems, same licensing.
362306a36Sopenharmony_ci#ifndef _CPU_SET_SCHED_PERF_H
462306a36Sopenharmony_ci#define _CPU_SET_SCHED_PERF_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <features.h>
762306a36Sopenharmony_ci#include <sched.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef CPU_EQUAL
1062306a36Sopenharmony_ci#ifndef __CPU_EQUAL_S
1162306a36Sopenharmony_ci#if __GNUC_PREREQ (2, 91)
1262306a36Sopenharmony_ci# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
1362306a36Sopenharmony_ci  (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
1462306a36Sopenharmony_ci#else
1562306a36Sopenharmony_ci# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
1662306a36Sopenharmony_ci  (__extension__							      \
1762306a36Sopenharmony_ci   ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits;			      \
1862306a36Sopenharmony_ci      const __cpu_mask *__arr2 = (cpusetp2)->__bits;			      \
1962306a36Sopenharmony_ci      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
2062306a36Sopenharmony_ci      size_t __i;							      \
2162306a36Sopenharmony_ci      for (__i = 0; __i < __imax; ++__i)				      \
2262306a36Sopenharmony_ci	if (__arr1[__i] != __arr2[__i])					      \
2362306a36Sopenharmony_ci	  break;							      \
2462306a36Sopenharmony_ci      __i == __imax; }))
2562306a36Sopenharmony_ci#endif
2662306a36Sopenharmony_ci#endif // __CPU_EQUAL_S
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define CPU_EQUAL(cpusetp1, cpusetp2) \
2962306a36Sopenharmony_ci  __CPU_EQUAL_S (sizeof (cpu_set_t), cpusetp1, cpusetp2)
3062306a36Sopenharmony_ci#endif // CPU_EQUAL
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#ifndef CPU_OR
3362306a36Sopenharmony_ci#ifndef __CPU_OP_S
3462306a36Sopenharmony_ci#define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
3562306a36Sopenharmony_ci  (__extension__							      \
3662306a36Sopenharmony_ci   ({ cpu_set_t *__dest = (destset);					      \
3762306a36Sopenharmony_ci      const __cpu_mask *__arr1 = (srcset1)->__bits;			      \
3862306a36Sopenharmony_ci      const __cpu_mask *__arr2 = (srcset2)->__bits;			      \
3962306a36Sopenharmony_ci      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
4062306a36Sopenharmony_ci      size_t __i;							      \
4162306a36Sopenharmony_ci      for (__i = 0; __i < __imax; ++__i)				      \
4262306a36Sopenharmony_ci	((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i];    \
4362306a36Sopenharmony_ci      __dest; }))
4462306a36Sopenharmony_ci#endif // __CPU_OP_S
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define CPU_OR(destset, srcset1, srcset2) \
4762306a36Sopenharmony_ci  __CPU_OP_S (sizeof (cpu_set_t), destset, srcset1, srcset2, |)
4862306a36Sopenharmony_ci#endif // CPU_OR
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#endif // _CPU_SET_SCHED_PERF_H
51