xref: /llvm-project/lldb/test/API/functionalities/thread/exit_during_expression/main.c (revision e37da2cef7ea44f6aa52dd37978b287a0741c39f)
1dbbed971SJim Ingham #include <errno.h>
2dbbed971SJim Ingham #include <pthread.h>
3dbbed971SJim Ingham #include <stdio.h>
4dbbed971SJim Ingham #include <unistd.h>
5dbbed971SJim Ingham 
6*e37da2ceSDmitry Vasilyev static unsigned int g_timeout = 1000000;
7dbbed971SJim Ingham 
8ef50d817SAaron Ballman extern int usleep(unsigned int);
9ef50d817SAaron Ballman 
function_to_call()10dbbed971SJim Ingham int function_to_call() {
11dbbed971SJim Ingham 
12dbbed971SJim Ingham   errno = 0;
13dbbed971SJim Ingham   while (1) {
14dbbed971SJim Ingham     int result = usleep(g_timeout);
15dbbed971SJim Ingham     if (errno != EINTR)
16dbbed971SJim Ingham       break;
17dbbed971SJim Ingham   }
18dbbed971SJim Ingham 
19dbbed971SJim Ingham   pthread_exit((void *)10);
20dbbed971SJim Ingham 
21dbbed971SJim Ingham   return 20; // Prevent warning
22dbbed971SJim Ingham }
23dbbed971SJim Ingham 
exiting_thread_func(void * unused)24dbbed971SJim Ingham void *exiting_thread_func(void *unused) {
25dbbed971SJim Ingham   function_to_call(); // Break here and cause the thread to exit
26dbbed971SJim Ingham   return NULL;
27dbbed971SJim Ingham }
28dbbed971SJim Ingham 
main()29dbbed971SJim Ingham int main() {
30dbbed971SJim Ingham   char *exit_ptr;
31dbbed971SJim Ingham   pthread_t exiting_thread;
32dbbed971SJim Ingham 
33dbbed971SJim Ingham   pthread_create(&exiting_thread, NULL, exiting_thread_func, NULL);
34dbbed971SJim Ingham 
35dbbed971SJim Ingham   pthread_join(exiting_thread, &exit_ptr);
36dbbed971SJim Ingham   int ret_val = (int)exit_ptr;
37dbbed971SJim Ingham   usleep(g_timeout * 4); // Make sure in the "run all threads" case
38dbbed971SJim Ingham                          // that we don't run past our breakpoint.
39dbbed971SJim Ingham   return ret_val;        // Break here to make sure the thread exited.
40dbbed971SJim Ingham }
41