| //===----------------------------------------------------------------------===// | |
| // | |
| // 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; | |
| } |