10258f566SSiva Chandra Reddy //===-- Unittests for pthread_attr_t --------------------------------------===// 20258f566SSiva Chandra Reddy // 30258f566SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40258f566SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 50258f566SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60258f566SSiva Chandra Reddy // 70258f566SSiva Chandra Reddy //===----------------------------------------------------------------------===// 80258f566SSiva Chandra Reddy 9*46944b0cSJob Henandez Lara #include "hdr/errno_macros.h" 100258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_destroy.h" 110258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getdetachstate.h" 120258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getguardsize.h" 130258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getstack.h" 140258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getstacksize.h" 150258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_init.h" 160258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setdetachstate.h" 170258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setguardsize.h" 180258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setstack.h" 190258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setstacksize.h" 200258f566SSiva Chandra Reddy 21af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h" 220258f566SSiva Chandra Reddy 230258f566SSiva Chandra Reddy #include <linux/param.h> // For EXEC_PAGESIZE. 240258f566SSiva Chandra Reddy #include <pthread.h> 250258f566SSiva Chandra Reddy 260258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadAttrTest, InitAndDestroy) { 270258f566SSiva Chandra Reddy pthread_attr_t attr; 28b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_init(&attr), 0); 290258f566SSiva Chandra Reddy 300258f566SSiva Chandra Reddy int detachstate; 31b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getdetachstate(&attr, &detachstate), 32b6bc9d72SGuillaume Chatelet 0); 330258f566SSiva Chandra Reddy ASSERT_EQ(detachstate, int(PTHREAD_CREATE_JOINABLE)); 340258f566SSiva Chandra Reddy 350258f566SSiva Chandra Reddy size_t guardsize; 36b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getguardsize(&attr, &guardsize), 0); 370258f566SSiva Chandra Reddy ASSERT_EQ(guardsize, size_t(EXEC_PAGESIZE)); 380258f566SSiva Chandra Reddy 39b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_destroy(&attr), 0); 400258f566SSiva Chandra Reddy } 410258f566SSiva Chandra Reddy 420258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetDetachState) { 430258f566SSiva Chandra Reddy pthread_attr_t attr; 44b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_init(&attr), 0); 450258f566SSiva Chandra Reddy 460258f566SSiva Chandra Reddy int detachstate; 47b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_attr_getdetachstate(&attr, &detachstate); 480258f566SSiva Chandra Reddy ASSERT_EQ(detachstate, int(PTHREAD_CREATE_JOINABLE)); 49b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_setdetachstate( 50b6bc9d72SGuillaume Chatelet &attr, PTHREAD_CREATE_DETACHED), 510258f566SSiva Chandra Reddy 0); 52b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getdetachstate(&attr, &detachstate), 53b6bc9d72SGuillaume Chatelet 0); 540258f566SSiva Chandra Reddy ASSERT_EQ(detachstate, int(PTHREAD_CREATE_DETACHED)); 550258f566SSiva Chandra Reddy 56b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_setdetachstate(&attr, 0xBAD), EINVAL); 570258f566SSiva Chandra Reddy 58b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_destroy(&attr), 0); 590258f566SSiva Chandra Reddy } 600258f566SSiva Chandra Reddy 610258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetGuardSize) { 620258f566SSiva Chandra Reddy pthread_attr_t attr; 63b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_init(&attr), 0); 640258f566SSiva Chandra Reddy 650258f566SSiva Chandra Reddy size_t guardsize; 66b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getguardsize(&attr, &guardsize), 0); 670258f566SSiva Chandra Reddy ASSERT_EQ(guardsize, size_t(EXEC_PAGESIZE)); 68b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_setguardsize(&attr, 2 * EXEC_PAGESIZE), 690258f566SSiva Chandra Reddy 0); 70b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getguardsize(&attr, &guardsize), 0); 710258f566SSiva Chandra Reddy ASSERT_EQ(guardsize, size_t(2 * EXEC_PAGESIZE)); 720258f566SSiva Chandra Reddy 73b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_setguardsize(&attr, EXEC_PAGESIZE / 2), 740258f566SSiva Chandra Reddy EINVAL); 750258f566SSiva Chandra Reddy 76b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_destroy(&attr), 0); 770258f566SSiva Chandra Reddy } 780258f566SSiva Chandra Reddy 790258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetStackSize) { 800258f566SSiva Chandra Reddy pthread_attr_t attr; 81b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_init(&attr), 0); 820258f566SSiva Chandra Reddy 830258f566SSiva Chandra Reddy size_t stacksize; 840258f566SSiva Chandra Reddy ASSERT_EQ( 85b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN << 2), 86b6bc9d72SGuillaume Chatelet 0); 87b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getstacksize(&attr, &stacksize), 0); 880258f566SSiva Chandra Reddy ASSERT_EQ(stacksize, size_t(PTHREAD_STACK_MIN << 2)); 890258f566SSiva Chandra Reddy 900258f566SSiva Chandra Reddy ASSERT_EQ( 91b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN / 2), 920258f566SSiva Chandra Reddy EINVAL); 930258f566SSiva Chandra Reddy 94b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_destroy(&attr), 0); 950258f566SSiva Chandra Reddy } 960258f566SSiva Chandra Reddy 970258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetStack) { 980258f566SSiva Chandra Reddy pthread_attr_t attr; 99b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_init(&attr), 0); 1000258f566SSiva Chandra Reddy 1010258f566SSiva Chandra Reddy void *stack; 1020258f566SSiva Chandra Reddy size_t stacksize; 1030258f566SSiva Chandra Reddy ASSERT_EQ( 104b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_attr_setstack(&attr, 0, PTHREAD_STACK_MIN << 2), 105b6bc9d72SGuillaume Chatelet 0); 106b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_getstack(&attr, &stack, &stacksize), 107b6bc9d72SGuillaume Chatelet 0); 1080258f566SSiva Chandra Reddy ASSERT_EQ(stacksize, size_t(PTHREAD_STACK_MIN << 2)); 1090258f566SSiva Chandra Reddy ASSERT_EQ(reinterpret_cast<uintptr_t>(stack), uintptr_t(0)); 1100258f566SSiva Chandra Reddy 111b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_setstack( 1120258f566SSiva Chandra Reddy &attr, reinterpret_cast<void *>(1), PTHREAD_STACK_MIN << 2), 1130258f566SSiva Chandra Reddy EINVAL); 114b6bc9d72SGuillaume Chatelet ASSERT_EQ( 115b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::pthread_attr_setstack(&attr, 0, PTHREAD_STACK_MIN / 2), 1160258f566SSiva Chandra Reddy EINVAL); 1170258f566SSiva Chandra Reddy 118b6bc9d72SGuillaume Chatelet ASSERT_EQ(LIBC_NAMESPACE::pthread_attr_destroy(&attr), 0); 1190258f566SSiva Chandra Reddy } 120