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 T_LOG("vm_page_size: %lld vm_kernel_page_size: %lld round_page(MIN): %lld", vm_page_size
, vm_kernel_page_size
, round_page(PTHREAD_STACK_MIN
));
44 size_t stacksizes
[] = {PTHREAD_STACK_MIN
, 1024ULL * 16, 1024ULL * 32, 1024ULL * 1024};
45 for (int i
= 0; (size_t)i
< sizeof(stacksizes
)/sizeof(stacksizes
[0]); i
++){
48 size_t stacksize
= stacksizes
[i
];
50 T_ASSERT_POSIX_ZERO(pthread_attr_init(&attr
), "[stacksize=%zu] pthread_attr_init", stacksize
);
51 T_ASSERT_POSIX_ZERO(pthread_attr_setstacksize(&attr
, stacksize
), "[stacksize=%zu] pthread_attr_stacksize", stacksize
);
53 T_ASSERT_POSIX_ZERO(pthread_create(&t
, &attr
, pthread_attr_setstacksize_func
, (void*)stacksize
), "[stacksize=%zu] pthread_create", stacksize
);
54 T_ASSERT_NOTNULL(t
, "[stacksize=%zu] pthread pointer not null", stacksize
);
56 T_EXPECT_POSIX_ZERO(pthread_attr_destroy(&attr
), "[stacksize=%zu] pthread_attr_destroy", stacksize
);
58 #if defined(__arm64__)
59 // Because of <rdar://problem/19941744>, the kext adds additional size to the stack on arm64.
62 T_EXPECT_EQ(stacksize
, pthread_get_stacksize_np(t
), "[stacksize=%zu] pthread stack size matches", stacksize
);
65 T_ASSERT_POSIX_ZERO(pthread_join(t
, &out
), "[stacksize=%zu] pthread_join", stacksize
);
66 T_EXPECT_EQ_PTR(out
, (void*)pthread_attr_setstacksize_func
, "[stacksize=%zu] pthread_join returns correct value", stacksize
);