]> git.saurik.com Git - apple/libpthread.git/blob - tests/custom_stack.c
libpthread-137.1.1.tar.gz
[apple/libpthread.git] / tests / custom_stack.c
1 #include <pthread.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <os/assumes.h>
6
7 void *function(void *arg) {
8 // Use the stack...
9 char buffer[BUFSIZ];
10 strlcpy(buffer, arg, sizeof(buffer));
11 strlcat(buffer, arg, sizeof(buffer));
12
13 printf("%s", buffer);
14 sleep(30);
15 return (void *)(uintptr_t)strlen(buffer);
16 }
17
18 int main(int argc, char *argv[]) {
19 char *arg = "This is a test and only a test of the pthread stackaddr system.\n";
20 size_t stacksize = 4096 * 5;
21 uintptr_t stackaddr = (uintptr_t)valloc(stacksize);
22 stackaddr += stacksize; // address starts at top of stack.
23
24 pthread_t thread;
25 pthread_attr_t attr;
26
27 os_assumes_zero(pthread_attr_init(&attr));
28 os_assumes_zero(pthread_attr_setstacksize(&attr, stacksize));
29 os_assumes_zero(pthread_attr_setstackaddr(&attr, (void *)stackaddr));
30
31 os_assumes_zero(pthread_create(&thread, &attr, function, arg));
32
33 void *result;
34 os_assumes_zero(pthread_join(thread, &result));
35 os_assumes((uintptr_t)result == (uintptr_t)strlen(arg)*2);
36
37 return 0;
38 }