7 #include "darwintest_defaults.h"
9 #define STACK_ALLOWANCE (1024ULL * 6)
12 pthread_attr_setstacksize_func(void *arg
)
14 if ((size_t)arg
< 1024ULL * 32) {
16 * We can't use darwintest because it requires a bigger stack than
17 * this, so cheat and use the return value for the test.
20 if ((size_t)arg
!= pthread_get_stacksize_np(pthread_self())) {
24 return (void*)pthread_attr_setstacksize_func
;
27 #if defined(__arm64__)
28 // Because of <rdar://problem/19941744>, the kext adds additional size to the stack on arm64.
31 T_EXPECT_EQ((size_t)arg
, pthread_get_stacksize_np(pthread_self()), "[stacksize=%zu] pthread_self stack size matches", (size_t)arg
);
33 size_t stacksize
= (size_t)arg
- STACK_ALLOWANCE
;
34 char *buf
= alloca(stacksize
);
36 memset_s(buf
, sizeof(buf
), 0, sizeof(buf
) - 1);
38 return (void*)pthread_attr_setstacksize_func
;
41 T_DECL(pthread_attr_setstacksize
, "pthread_attr_setstacksize")
43 size_t stacksizes
[] = {PTHREAD_STACK_MIN
, 1024ULL * 16, 1024ULL * 32, 1024ULL * 1024};
44 for (int i
= 0; (size_t)i
< sizeof(stacksizes
)/sizeof(stacksizes
[0]); i
++){
47 size_t stacksize
= stacksizes
[i
];
49 T_ASSERT_POSIX_ZERO(pthread_attr_init(&attr
), "[stacksize=%zu] pthread_attr_init", stacksize
);
50 T_ASSERT_POSIX_ZERO(pthread_attr_setstacksize(&attr
, stacksize
), "[stacksize=%zu] pthread_attr_stacksize", stacksize
);
52 T_ASSERT_POSIX_ZERO(pthread_create(&t
, &attr
, pthread_attr_setstacksize_func
, (void*)stacksize
), "[stacksize=%zu] pthread_create", stacksize
);
53 T_ASSERT_NOTNULL(t
, "[stacksize=%zu] pthread pointer not null", stacksize
);
55 T_EXPECT_POSIX_ZERO(pthread_attr_destroy(&attr
), "[stacksize=%zu] pthread_attr_destroy", stacksize
);
57 #if defined(__arm64__)
58 // Because of <rdar://problem/19941744>, the kext adds additional size to the stack on arm64.
61 T_EXPECT_EQ(stacksize
, pthread_get_stacksize_np(t
), "[stacksize=%zu] pthread stack size matches", stacksize
);
64 T_ASSERT_POSIX_ZERO(pthread_join(t
, &out
), "[stacksize=%zu] pthread_join", stacksize
);
65 T_EXPECT_EQ_PTR(out
, (void*)pthread_attr_setstacksize_func
, "[stacksize=%zu] pthread_join returns correct value", stacksize
);