| //===----------------------------------------------------------------------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// Integration tests for pthread_setschedparam and pthread_getschedparam. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "hdr/errno_macros.h" |
| #include "hdr/sched_macros.h" |
| #include "hdr/types/pthread_t.h" |
| #include "hdr/types/struct_sched_param.h" |
| #include "src/pthread/pthread_create.h" |
| #include "src/pthread/pthread_getschedparam.h" |
| #include "src/pthread/pthread_join.h" |
| #include "src/pthread/pthread_mutex_destroy.h" |
| #include "src/pthread/pthread_mutex_init.h" |
| #include "src/pthread/pthread_mutex_lock.h" |
| #include "src/pthread/pthread_mutex_unlock.h" |
| #include "src/pthread/pthread_self.h" |
| #include "src/pthread/pthread_setschedparam.h" |
| #include "test/IntegrationTest/test.h" |
| |
| #include <pthread.h> |
| |
| static pthread_mutex_t mutex; |
| |
| static void *child_func(void *) { |
| LIBC_NAMESPACE::pthread_mutex_lock(&mutex); |
| LIBC_NAMESPACE::pthread_mutex_unlock(&mutex); |
| return nullptr; |
| } |
| |
| TEST_MAIN() { |
| auto main_thread = LIBC_NAMESPACE::pthread_self(); |
| sched_param param; |
| int policy; |
| |
| // 1. Test getschedparam on self |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_getschedparam(main_thread, &policy, ¶m), |
| 0); |
| |
| // 2. Test setschedparam on self (Success) |
| param.sched_priority = 0; |
| ASSERT_EQ( |
| LIBC_NAMESPACE::pthread_setschedparam(main_thread, SCHED_OTHER, ¶m), |
| 0); |
| |
| // Verify it was set |
| int new_policy; |
| sched_param new_param; |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_getschedparam(main_thread, &new_policy, |
| &new_param), |
| 0); |
| ASSERT_EQ(new_policy, SCHED_OTHER); |
| ASSERT_EQ(new_param.sched_priority, 0); |
| |
| // 3. Test setschedparam on self (Failure - Invalid Policy) |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_setschedparam(main_thread, -1, ¶m), |
| EINVAL); |
| |
| // 4. Test setschedparam on self (Failure - Invalid Priority for SCHED_OTHER) |
| param.sched_priority = 1; // Invalid for SCHED_OTHER |
| ASSERT_EQ( |
| LIBC_NAMESPACE::pthread_setschedparam(main_thread, SCHED_OTHER, ¶m), |
| EINVAL); |
| param.sched_priority = 0; // Reset |
| |
| // 5. Test on Child Thread |
| // Initialize and lock mutex to prevent child thread from exiting before main |
| // thread runs tests |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_mutex_init(&mutex, nullptr), 0); |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_mutex_lock(&mutex), 0); |
| |
| pthread_t th; |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_create(&th, nullptr, child_func, nullptr), |
| 0); |
| |
| // Get child's default sched param |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_getschedparam(th, &policy, ¶m), 0); |
| |
| // Set child's sched param (Success) |
| param.sched_priority = 0; |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_setschedparam(th, SCHED_OTHER, ¶m), 0); |
| |
| // Verify child's sched param |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_getschedparam(th, &new_policy, &new_param), |
| 0); |
| ASSERT_EQ(new_policy, SCHED_OTHER); |
| ASSERT_EQ(new_param.sched_priority, 0); |
| |
| // Set child's sched param (Failure - Invalid Policy) |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_setschedparam(th, -1, ¶m), EINVAL); |
| |
| // Set child's sched param (Failure - Invalid Priority) |
| param.sched_priority = 1; |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_setschedparam(th, SCHED_OTHER, ¶m), |
| EINVAL); |
| |
| // Release mutex so child thread can complete execution |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_mutex_unlock(&mutex), 0); |
| |
| void *retval; |
| ASSERT_EQ(LIBC_NAMESPACE::pthread_join(th, &retval), 0); |
| |
| LIBC_NAMESPACE::pthread_mutex_destroy(&mutex); |
| |
| return 0; |
| } |