1*0258f566SSiva Chandra Reddy //===-- Unittests for pthread_attr_t --------------------------------------===//
2*0258f566SSiva Chandra Reddy //
3*0258f566SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0258f566SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5*0258f566SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0258f566SSiva Chandra Reddy //
7*0258f566SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8*0258f566SSiva Chandra Reddy
9*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_destroy.h"
10*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getdetachstate.h"
11*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getguardsize.h"
12*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getstack.h"
13*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_getstacksize.h"
14*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_init.h"
15*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setdetachstate.h"
16*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setguardsize.h"
17*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setstack.h"
18*0258f566SSiva Chandra Reddy #include "src/pthread/pthread_attr_setstacksize.h"
19*0258f566SSiva Chandra Reddy
20*0258f566SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
21*0258f566SSiva Chandra Reddy
22*0258f566SSiva Chandra Reddy #include <errno.h>
23*0258f566SSiva Chandra Reddy #include <linux/param.h> // For EXEC_PAGESIZE.
24*0258f566SSiva Chandra Reddy #include <pthread.h>
25*0258f566SSiva Chandra Reddy
TEST(LlvmLibcPThreadAttrTest,InitAndDestroy)26*0258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadAttrTest, InitAndDestroy) {
27*0258f566SSiva Chandra Reddy pthread_attr_t attr;
28*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_init(&attr), 0);
29*0258f566SSiva Chandra Reddy
30*0258f566SSiva Chandra Reddy int detachstate;
31*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getdetachstate(&attr, &detachstate), 0);
32*0258f566SSiva Chandra Reddy ASSERT_EQ(detachstate, int(PTHREAD_CREATE_JOINABLE));
33*0258f566SSiva Chandra Reddy
34*0258f566SSiva Chandra Reddy size_t guardsize;
35*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getguardsize(&attr, &guardsize), 0);
36*0258f566SSiva Chandra Reddy ASSERT_EQ(guardsize, size_t(EXEC_PAGESIZE));
37*0258f566SSiva Chandra Reddy
38*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_destroy(&attr), 0);
39*0258f566SSiva Chandra Reddy }
40*0258f566SSiva Chandra Reddy
TEST(LlvmLibcPThreadattrTest,SetAndGetDetachState)41*0258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetDetachState) {
42*0258f566SSiva Chandra Reddy pthread_attr_t attr;
43*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_init(&attr), 0);
44*0258f566SSiva Chandra Reddy
45*0258f566SSiva Chandra Reddy int detachstate;
46*0258f566SSiva Chandra Reddy __llvm_libc::pthread_attr_getdetachstate(&attr, &detachstate);
47*0258f566SSiva Chandra Reddy ASSERT_EQ(detachstate, int(PTHREAD_CREATE_JOINABLE));
48*0258f566SSiva Chandra Reddy ASSERT_EQ(
49*0258f566SSiva Chandra Reddy __llvm_libc::pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED),
50*0258f566SSiva Chandra Reddy 0);
51*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getdetachstate(&attr, &detachstate), 0);
52*0258f566SSiva Chandra Reddy ASSERT_EQ(detachstate, int(PTHREAD_CREATE_DETACHED));
53*0258f566SSiva Chandra Reddy
54*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_setdetachstate(&attr, 0xBAD), EINVAL);
55*0258f566SSiva Chandra Reddy
56*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_destroy(&attr), 0);
57*0258f566SSiva Chandra Reddy }
58*0258f566SSiva Chandra Reddy
TEST(LlvmLibcPThreadattrTest,SetAndGetGuardSize)59*0258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetGuardSize) {
60*0258f566SSiva Chandra Reddy pthread_attr_t attr;
61*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_init(&attr), 0);
62*0258f566SSiva Chandra Reddy
63*0258f566SSiva Chandra Reddy size_t guardsize;
64*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getguardsize(&attr, &guardsize), 0);
65*0258f566SSiva Chandra Reddy ASSERT_EQ(guardsize, size_t(EXEC_PAGESIZE));
66*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_setguardsize(&attr, 2 * EXEC_PAGESIZE),
67*0258f566SSiva Chandra Reddy 0);
68*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getguardsize(&attr, &guardsize), 0);
69*0258f566SSiva Chandra Reddy ASSERT_EQ(guardsize, size_t(2 * EXEC_PAGESIZE));
70*0258f566SSiva Chandra Reddy
71*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_setguardsize(&attr, EXEC_PAGESIZE / 2),
72*0258f566SSiva Chandra Reddy EINVAL);
73*0258f566SSiva Chandra Reddy
74*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_destroy(&attr), 0);
75*0258f566SSiva Chandra Reddy }
76*0258f566SSiva Chandra Reddy
TEST(LlvmLibcPThreadattrTest,SetAndGetStackSize)77*0258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetStackSize) {
78*0258f566SSiva Chandra Reddy pthread_attr_t attr;
79*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_init(&attr), 0);
80*0258f566SSiva Chandra Reddy
81*0258f566SSiva Chandra Reddy size_t stacksize;
82*0258f566SSiva Chandra Reddy ASSERT_EQ(
83*0258f566SSiva Chandra Reddy __llvm_libc::pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN << 2), 0);
84*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getstacksize(&attr, &stacksize), 0);
85*0258f566SSiva Chandra Reddy ASSERT_EQ(stacksize, size_t(PTHREAD_STACK_MIN << 2));
86*0258f566SSiva Chandra Reddy
87*0258f566SSiva Chandra Reddy ASSERT_EQ(
88*0258f566SSiva Chandra Reddy __llvm_libc::pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN / 2),
89*0258f566SSiva Chandra Reddy EINVAL);
90*0258f566SSiva Chandra Reddy
91*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_destroy(&attr), 0);
92*0258f566SSiva Chandra Reddy }
93*0258f566SSiva Chandra Reddy
TEST(LlvmLibcPThreadattrTest,SetAndGetStack)94*0258f566SSiva Chandra Reddy TEST(LlvmLibcPThreadattrTest, SetAndGetStack) {
95*0258f566SSiva Chandra Reddy pthread_attr_t attr;
96*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_init(&attr), 0);
97*0258f566SSiva Chandra Reddy
98*0258f566SSiva Chandra Reddy void *stack;
99*0258f566SSiva Chandra Reddy size_t stacksize;
100*0258f566SSiva Chandra Reddy ASSERT_EQ(
101*0258f566SSiva Chandra Reddy __llvm_libc::pthread_attr_setstack(&attr, 0, PTHREAD_STACK_MIN << 2), 0);
102*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_getstack(&attr, &stack, &stacksize), 0);
103*0258f566SSiva Chandra Reddy ASSERT_EQ(stacksize, size_t(PTHREAD_STACK_MIN << 2));
104*0258f566SSiva Chandra Reddy ASSERT_EQ(reinterpret_cast<uintptr_t>(stack), uintptr_t(0));
105*0258f566SSiva Chandra Reddy
106*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_setstack(
107*0258f566SSiva Chandra Reddy &attr, reinterpret_cast<void *>(1), PTHREAD_STACK_MIN << 2),
108*0258f566SSiva Chandra Reddy EINVAL);
109*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_setstack(&attr, 0, PTHREAD_STACK_MIN / 2),
110*0258f566SSiva Chandra Reddy EINVAL);
111*0258f566SSiva Chandra Reddy
112*0258f566SSiva Chandra Reddy ASSERT_EQ(__llvm_libc::pthread_attr_destroy(&attr), 0);
113*0258f566SSiva Chandra Reddy }
114