diff --git a/libc/include/llvm-libc-macros/linux/sched-macros.h b/libc/include/llvm-libc-macros/linux/sched-macros.h index 597789bb4ce2..4d8aafbc2df2 100644 --- a/libc/include/llvm-libc-macros/linux/sched-macros.h +++ b/libc/include/llvm-libc-macros/linux/sched-macros.h @@ -30,8 +30,8 @@ #define CPU_ZERO_S(setsize, set) __sched_setcpuzero(setsize, set) #define CPU_ZERO(set) CPU_ZERO_S(sizeof(cpu_set_t), set) #define CPU_SET_S(cpu, setsize, set) __sched_setcpuset(cpu, setsize, set) -#define CPU_SET(cpu, setsize, set) CPU_SET_S(cpu, sizeof(cpt_set_t), set) +#define CPU_SET(cpu, set) CPU_SET_S(cpu, sizeof(cpu_set_t), set) #define CPU_ISSET_S(cpu, setsize, set) __sched_getcpuisset(cpu, setsize, set) -#define CPU_ISSET(cpu, setsize, set) CPU_ISSET_S(cpu, sizeof(cpt_set_t), set) +#define CPU_ISSET(cpu, set) CPU_ISSET_S(cpu, sizeof(cpu_set_t), set) #endif // LLVM_LIBC_MACROS_LINUX_SCHED_MACROS_H diff --git a/libc/include/sched.yaml b/libc/include/sched.yaml index b75dee300044..b07dd0df7c92 100644 --- a/libc/include/sched.yaml +++ b/libc/include/sched.yaml @@ -25,6 +25,29 @@ functions: arguments: - type: size_t - type: const cpu_set_t * + - name: __sched_getcpuisset + standards: + - llvm_libc_ext + return_type: int + arguments: + - type: int + - type: size_t + - type: const cpu_set_t * + - name: __sched_setcpuset + standards: + - llvm_libc_ext + return_type: void + arguments: + - type: int + - type: size_t + - type: cpu_set_t * + - name: __sched_setcpuzero + standards: + - llvm_libc_ext + return_type: void + arguments: + - type: size_t + - type: cpu_set_t * - name: getcpu standards: - Linux diff --git a/libc/src/sched/linux/sched_getcpuisset.cpp b/libc/src/sched/linux/sched_getcpuisset.cpp index da9f97127d07..b26e4713ac8f 100644 --- a/libc/src/sched/linux/sched_getcpuisset.cpp +++ b/libc/src/sched/linux/sched_getcpuisset.cpp @@ -19,7 +19,7 @@ namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(int, __sched_getcpuisset, - (int cpu, const size_t cpuset_size, cpu_set_t *set)) { + (int cpu, const size_t cpuset_size, const cpu_set_t *set)) { LIBC_CRASH_ON_NULLPTR(set); if (static_cast(cpu) / 8 < cpuset_size) { diff --git a/libc/src/sched/sched_getcpuisset.h b/libc/src/sched/sched_getcpuisset.h index 8e6f69c44313..f36a61355dde 100644 --- a/libc/src/sched/sched_getcpuisset.h +++ b/libc/src/sched/sched_getcpuisset.h @@ -17,7 +17,8 @@ namespace LIBC_NAMESPACE_DECL { // for internal use in the CPU_ISSET macro -int __sched_getcpuisset(int cpu, const size_t cpuset_size, cpu_set_t *set); +int __sched_getcpuisset(int cpu, const size_t cpuset_size, + const cpu_set_t *set); } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/include/CMakeLists.txt b/libc/test/include/CMakeLists.txt index dc044a5848e7..85915f5a2fbd 100644 --- a/libc/test/include/CMakeLists.txt +++ b/libc/test/include/CMakeLists.txt @@ -87,6 +87,17 @@ add_libc_test( libc.include.llvm-libc-macros.stdckdint_macros ) +add_libc_test( + sched_test + UNIT_TEST_ONLY + SUITE + libc_include_tests + SRCS + sched_test.cpp + DEPENDS + libc.include.sched +) + add_libc_test( issubnormal_test SUITE diff --git a/libc/test/include/sched_test.cpp b/libc/test/include/sched_test.cpp new file mode 100644 index 000000000000..2a189a571b13 --- /dev/null +++ b/libc/test/include/sched_test.cpp @@ -0,0 +1,26 @@ +//===-- Unittests for sched -----------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +template struct SameType { + static constexpr bool value = false; +}; + +template struct SameType { + static constexpr bool value = true; +}; + +// Use unevaluated contexts to verify the public macro declarations without +// requiring this include test to link the helper entrypoints. +static_assert(SameType::value, ""); +static_assert(SameType::value, ""); +static_assert(SameType::value, ""); +static_assert(SameType::value, ""); + +extern "C" int main() { return 0; } diff --git a/libc/test/src/sched/CMakeLists.txt b/libc/test/src/sched/CMakeLists.txt index 93752ed26108..66c37e3d5a53 100644 --- a/libc/test/src/sched/CMakeLists.txt +++ b/libc/test/src/sched/CMakeLists.txt @@ -109,6 +109,9 @@ add_libc_unittest( libc.src.errno.errno libc.src.sched.sched_getaffinity libc.src.sched.__sched_getcpucount + libc.src.sched.__sched_getcpuisset + libc.src.sched.__sched_setcpuset + libc.src.sched.__sched_setcpuzero libc.test.UnitTest.ErrnoCheckingTest libc.test.UnitTest.ErrnoSetterMatcher ) diff --git a/libc/test/src/sched/cpu_count_test.cpp b/libc/test/src/sched/cpu_count_test.cpp index 217324e3e476..55daa2e42181 100644 --- a/libc/test/src/sched/cpu_count_test.cpp +++ b/libc/test/src/sched/cpu_count_test.cpp @@ -9,6 +9,9 @@ #include "src/__support/OSUtil/syscall.h" #include "src/sched/sched_getaffinity.h" #include "src/sched/sched_getcpucount.h" +#include "src/sched/sched_getcpuisset.h" +#include "src/sched/sched_setcpuset.h" +#include "src/sched/sched_setcpuzero.h" #include "test/UnitTest/ErrnoCheckingTest.h" #include "test/UnitTest/ErrnoSetterMatcher.h" @@ -32,3 +35,15 @@ TEST_F(LlvmLibcSchedCpuCountTest, SmokeTest) { ASSERT_GT(num_cpus, 0); ASSERT_LE(num_cpus, int(sizeof(cpu_set_t) * sizeof(unsigned long))); } + +TEST_F(LlvmLibcSchedCpuCountTest, CpuSetMacros) { + cpu_set_t mask; + + LIBC_NAMESPACE::CPU_ZERO(&mask); + ASSERT_EQ(LIBC_NAMESPACE::CPU_COUNT(&mask), 0); + ASSERT_EQ(LIBC_NAMESPACE::CPU_ISSET(1, &mask), 0); + + LIBC_NAMESPACE::CPU_SET(1, &mask); + ASSERT_EQ(LIBC_NAMESPACE::CPU_ISSET(1, &mask), 1); + ASSERT_EQ(LIBC_NAMESPACE::CPU_COUNT(&mask), 1); +}