1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * pthread_cond_wait() test program. 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * See also https://bugs.kde.org/show_bug.cgi?id=235681. 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h> 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h> 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h> 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpthread_mutex_t mutex; 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpthread_cond_t cond_var; 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint status; 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint silent; 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void *run_fn(void *v) 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int rc; 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "run_fn starting\n"); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_mutex_lock(&mutex); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown while (!status) { 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "run_fn(): status==0\n"); 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_cond_wait(&cond_var, &mutex); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "run_fn(): woke up\n"); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "run_fn(): status==1\n"); 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_mutex_unlock(&mutex); 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "run_fn done\n"); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return NULL; 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv) 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int rc; 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_t other_thread; 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (argc > 1) 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown silent = 1; 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_mutex_init(&mutex, NULL); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_cond_init(&cond_var, NULL); 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown status = 0; 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_create(&other_thread, NULL, run_fn, NULL); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* yield the processor, and give the other thread a chance to get into the while loop */ 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "main(): sleeping...\n"); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sleep(1); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_mutex_lock(&mutex); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /**** BEGIN CS *****/ 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "main(): status=1\n"); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown status = 1; 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_cond_broadcast(&cond_var); 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /**** END CS *****/ 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_mutex_unlock(&mutex); 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!silent) 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "joining...\n"); 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rc = pthread_join(other_thread, NULL); 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(!rc); 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Done.\n"); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 95