| /* |
| * pthread_cond_wait() test program. |
| * See also https://bugs.kde.org/show_bug.cgi?id=235681. |
| */ |
| |
| #include <string.h> |
| #include <stdio.h> |
| #include <assert.h> |
| #include <pthread.h> |
| #include <errno.h> |
| #include <unistd.h> |
| |
| pthread_mutex_t mutex; |
| pthread_cond_t cond_var; |
| int status; |
| int silent; |
| |
| static void *run_fn(void *v) |
| { |
| int rc; |
| |
| if (!silent) |
| fprintf(stderr, "run_fn starting\n"); |
| |
| rc = pthread_mutex_lock(&mutex); |
| assert(!rc); |
| |
| while (!status) { |
| if (!silent) |
| fprintf(stderr, "run_fn(): status==0\n"); |
| rc = pthread_cond_wait(&cond_var, &mutex); |
| assert(!rc); |
| if (!silent) |
| fprintf(stderr, "run_fn(): woke up\n"); |
| } |
| if (!silent) |
| fprintf(stderr, "run_fn(): status==1\n"); |
| |
| rc = pthread_mutex_unlock(&mutex); |
| assert(!rc); |
| |
| if (!silent) |
| fprintf(stderr, "run_fn done\n"); |
| |
| return NULL; |
| } |
| |
| int main(int argc, char **argv) |
| { |
| int rc; |
| pthread_t other_thread; |
| |
| if (argc > 1) |
| silent = 1; |
| |
| rc = pthread_mutex_init(&mutex, NULL); |
| assert(!rc); |
| rc = pthread_cond_init(&cond_var, NULL); |
| assert(!rc); |
| |
| status = 0; |
| |
| rc = pthread_create(&other_thread, NULL, run_fn, NULL); |
| assert(!rc); |
| |
| /* yield the processor, and give the other thread a chance to get into the while loop */ |
| if (!silent) |
| fprintf(stderr, "main(): sleeping...\n"); |
| sleep(1); |
| |
| rc = pthread_mutex_lock(&mutex); |
| assert(!rc); |
| /**** BEGIN CS *****/ |
| |
| if (!silent) |
| fprintf(stderr, "main(): status=1\n"); |
| status = 1; |
| rc = pthread_cond_broadcast(&cond_var); |
| assert(!rc); |
| |
| /**** END CS *****/ |
| rc = pthread_mutex_unlock(&mutex); |
| assert(!rc); |
| |
| if (!silent) |
| fprintf(stderr, "joining...\n"); |
| |
| rc = pthread_join(other_thread, NULL); |
| assert(!rc); |
| |
| fprintf(stderr, "Done.\n"); |
| |
| return 0; |
| } |