^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: LGPL-2.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Definitions taken from glibc for use with older systems, same licensing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #ifndef _CPU_SET_SCHED_PERF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #define _CPU_SET_SCHED_PERF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <features.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifndef CPU_EQUAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #ifndef __CPU_EQUAL_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #if __GNUC_PREREQ (2, 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) # define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) # define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) (__extension__ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) const __cpu_mask *__arr2 = (cpusetp2)->__bits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) size_t __imax = (setsize) / sizeof (__cpu_mask); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) size_t __i; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) for (__i = 0; __i < __imax; ++__i) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) if (__arr1[__i] != __arr2[__i]) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) __i == __imax; }))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #endif // __CPU_EQUAL_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define CPU_EQUAL(cpusetp1, cpusetp2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) __CPU_EQUAL_S (sizeof (cpu_set_t), cpusetp1, cpusetp2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #endif // CPU_EQUAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #ifndef CPU_OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #ifndef __CPU_OP_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) (__extension__ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ({ cpu_set_t *__dest = (destset); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) const __cpu_mask *__arr1 = (srcset1)->__bits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) const __cpu_mask *__arr2 = (srcset2)->__bits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) size_t __imax = (setsize) / sizeof (__cpu_mask); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) size_t __i; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) for (__i = 0; __i < __imax; ++__i) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) __dest; }))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #endif // __CPU_OP_S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define CPU_OR(destset, srcset1, srcset2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) __CPU_OP_S (sizeof (cpu_set_t), destset, srcset1, srcset2, |)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #endif // CPU_OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #endif // _CPU_SET_SCHED_PERF_H