1 /* Test whether assigning names to threads works properly. */ 2 3 4 #include <pthread.h> 5 #include <stddef.h> 6 #include <stdio.h> 7 #include <string.h> 8 #include "../../drd/drd.h" 9 10 11 #define NUM_THREADS 10 12 13 14 static pthread_mutex_t s_mutex; 15 static pthread_cond_t s_cond; 16 static int s_counter; 17 18 static void* thread_func(void* argp) 19 { 20 const int thread_num = (ptrdiff_t)(argp); 21 pthread_mutex_t invalid_mutex; 22 char thread_name[32]; 23 24 snprintf(thread_name, sizeof(thread_name), 25 "thread_func instance %d", thread_num + 1); 26 ANNOTATE_THREAD_NAME(thread_name); 27 28 memset(&invalid_mutex, 0xff, sizeof(invalid_mutex)); 29 30 pthread_mutex_lock(&s_mutex); 31 while (s_counter != thread_num) 32 pthread_cond_wait(&s_cond, &s_mutex); 33 fprintf(stderr, "\n%s\n\n", thread_name); 34 pthread_mutex_unlock(&invalid_mutex); 35 s_counter++; 36 pthread_cond_broadcast(&s_cond); 37 pthread_mutex_unlock(&s_mutex); 38 39 return 0; 40 } 41 42 43 int main(int arg, char** argv) 44 { 45 int i; 46 pthread_t tid[NUM_THREADS]; 47 48 pthread_mutex_init(&s_mutex, 0); 49 pthread_cond_init(&s_cond, 0); 50 51 for (i = 0; i < NUM_THREADS; i++) 52 pthread_create(&tid[i], 0, thread_func, (void*)(ptrdiff_t)i); 53 54 for (i = 0; i < NUM_THREADS; i++) 55 pthread_join(tid[i], 0); 56 57 pthread_cond_destroy(&s_cond); 58 pthread_mutex_destroy(&s_mutex); 59 60 return 0; 61 } 62