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