1658c84e4SSiva Chandra Reddy //===-- Tests for pthread_equal -------------------------------------------===// 2658c84e4SSiva Chandra Reddy // 3658c84e4SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4658c84e4SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5658c84e4SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6658c84e4SSiva Chandra Reddy // 7658c84e4SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8658c84e4SSiva Chandra Reddy 9aa59c981SGuillaume Chatelet #include "src/__support/CPP/string_view.h" 10*46944b0cSJob Henandez Lara #include "src/errno/libc_errno.h" 11658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_create.h" 12658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_getname_np.h" 13658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_join.h" 14658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_mutex_destroy.h" 15658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_mutex_init.h" 16658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_mutex_lock.h" 17658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_mutex_unlock.h" 18658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_self.h" 19658c84e4SSiva Chandra Reddy #include "src/pthread/pthread_setname_np.h" 20658c84e4SSiva Chandra Reddy 21af1315c2SSiva Chandra Reddy #include "test/IntegrationTest/test.h" 22658c84e4SSiva Chandra Reddy 23658c84e4SSiva Chandra Reddy #include <pthread.h> 24d9c135cfSGuillaume Chatelet #include <stdint.h> // uintptr_t 25658c84e4SSiva Chandra Reddy 26b6bc9d72SGuillaume Chatelet using string_view = LIBC_NAMESPACE::cpp::string_view; 27658c84e4SSiva Chandra Reddy 28658c84e4SSiva Chandra Reddy char child_thread_name_buffer[16]; 29658c84e4SSiva Chandra Reddy pthread_mutex_t mutex; 30658c84e4SSiva Chandra Reddy 31658c84e4SSiva Chandra Reddy static void *child_func(void *) { 32b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_mutex_lock(&mutex); 33b6bc9d72SGuillaume Chatelet auto self = LIBC_NAMESPACE::pthread_self(); 34b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_getname_np(self, child_thread_name_buffer, 16); 35b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_mutex_unlock(&mutex); 36658c84e4SSiva Chandra Reddy return nullptr; 37658c84e4SSiva Chandra Reddy } 38658c84e4SSiva Chandra Reddy 39658c84e4SSiva Chandra Reddy TEST_MAIN() { 40658c84e4SSiva Chandra Reddy // We init and lock the mutex so that we guarantee that the child thread is 41658c84e4SSiva Chandra Reddy // waiting after startup. 42b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_mutex_init(&mutex, nullptr), 0); 43b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_mutex_lock(&mutex), 0); 44658c84e4SSiva Chandra Reddy 45b6bc9d72SGuillaume Chatelet auto main_thread = LIBC_NAMESPACE::pthread_self(); 46658c84e4SSiva Chandra Reddy const char MAIN_THREAD_NAME[] = "main_thread"; 47658c84e4SSiva Chandra Reddy char thread_name_buffer[16]; 48b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_setname_np(main_thread, MAIN_THREAD_NAME), 49b6bc9d72SGuillaume Chatelet 0); 50658c84e4SSiva Chandra Reddy ASSERT_EQ( 51b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_getname_np(main_thread, thread_name_buffer, 16), 52b6bc9d72SGuillaume Chatelet 0); 531e5b3ce7SGuillaume Chatelet ASSERT_EQ(string_view(MAIN_THREAD_NAME), 541e5b3ce7SGuillaume Chatelet string_view(reinterpret_cast<const char *>(thread_name_buffer))); 55658c84e4SSiva Chandra Reddy 56658c84e4SSiva Chandra Reddy pthread_t th; 57b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_create(&th, nullptr, child_func, nullptr), 58b6bc9d72SGuillaume Chatelet 0); 59658c84e4SSiva Chandra Reddy // This new thread should of course not be equal to the main thread. 60658c84e4SSiva Chandra Reddy const char CHILD_THREAD_NAME[] = "child_thread"; 61b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_setname_np(th, CHILD_THREAD_NAME), 0); 62b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_getname_np(th, thread_name_buffer, 16), 0); 631e5b3ce7SGuillaume Chatelet ASSERT_EQ(string_view(CHILD_THREAD_NAME), 641e5b3ce7SGuillaume Chatelet string_view(reinterpret_cast<const char *>(thread_name_buffer))); 65658c84e4SSiva Chandra Reddy 66b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_mutex_unlock(&mutex), 0); 67658c84e4SSiva Chandra Reddy 68658c84e4SSiva Chandra Reddy void *retval; 69b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_join(th, &retval), 0); 70658c84e4SSiva Chandra Reddy ASSERT_EQ(uintptr_t(retval), uintptr_t(nullptr)); 71658c84e4SSiva Chandra Reddy // Make sure that the child thread saw it name correctly. 721e5b3ce7SGuillaume Chatelet ASSERT_EQ( 731e5b3ce7SGuillaume Chatelet string_view(CHILD_THREAD_NAME), 741e5b3ce7SGuillaume Chatelet string_view(reinterpret_cast<const char *>(child_thread_name_buffer))); 75658c84e4SSiva Chandra Reddy 76b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_mutex_destroy(&mutex); 77658c84e4SSiva Chandra Reddy 78b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_setname_np( 79b6bc9d72SGuillaume Chatelet main_thread, "a really long name for a thread"), 80658c84e4SSiva Chandra Reddy ERANGE); 81658c84e4SSiva Chandra Reddy char smallbuf[1]; 82b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_getname_np(main_thread, smallbuf, 1), 83b6bc9d72SGuillaume Chatelet ERANGE); 84658c84e4SSiva Chandra Reddy 85658c84e4SSiva Chandra Reddy return 0; 86658c84e4SSiva Chandra Reddy } 87