7 #include <darwintest.h>
9 #define STACK_ALLOWANCE (1024ULL * 6)
12 pthread_attr_setstacksize_func(void *arg
)
14 #if defined(__arm64__)
15 // Because of <rdar://problem/19941744>, the kext adds additional size to the stack on arm64.
18 T_EXPECT_EQ((size_t)arg
, pthread_get_stacksize_np(pthread_self()), "[stacksize=%zu] pthread_self stack size matches", (size_t)arg
);
20 size_t stacksize
= (size_t)arg
- STACK_ALLOWANCE
;
21 char *buf
= alloca(stacksize
);
23 memset_s(buf
, sizeof(buf
), 0, sizeof(buf
) - 1);
25 return (void*)pthread_attr_setstacksize_func
;
28 T_DECL(pthread_attr_setstacksize
, "pthread_attr_setstacksize")
30 size_t stacksizes
[] = {PTHREAD_STACK_MIN
, 1024ULL * 16, 1024ULL * 32, 1024ULL * 1024};
31 for (int i
= 0; (size_t)i
< sizeof(stacksizes
)/sizeof(stacksizes
[0]); i
++){
34 size_t stacksize
= stacksizes
[i
];
36 T_ASSERT_POSIX_ZERO(pthread_attr_init(&attr
), "[stacksize=%zu] pthread_attr_init", stacksize
);
37 T_ASSERT_POSIX_ZERO(pthread_attr_setstacksize(&attr
, stacksize
), "[stacksize=%zu] pthread_attr_stacksize", stacksize
);
39 T_ASSERT_POSIX_ZERO(pthread_create(&t
, &attr
, pthread_attr_setstacksize_func
, (void*)stacksize
), "[stacksize=%zu] pthread_create", stacksize
);
40 T_ASSERT_NOTNULL(t
, "[stacksize=%zu] pthread pointer not null", stacksize
);
42 T_EXPECT_POSIX_ZERO(pthread_attr_destroy(&attr
), "[stacksize=%zu] pthread_attr_destroy", stacksize
);
44 #if defined(__arm64__)
45 // Because of <rdar://problem/19941744>, the kext adds additional size to the stack on arm64.
48 T_EXPECT_EQ(stacksize
, pthread_get_stacksize_np(t
), "[stacksize=%zu] pthread stack size matches", stacksize
);
51 T_ASSERT_POSIX_ZERO(pthread_join(t
, &out
), "[stacksize=%zu] pthread_join", stacksize
);
52 T_EXPECT_EQ_PTR(out
, (void*)pthread_attr_setstacksize_func
, "[stacksize=%zu] pthread_join returns correct value", stacksize
);