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 Inghamint 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 Inghamvoid *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 Inghamint 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