1 /* Test of condition variables in multithreaded situations.
2 Copyright (C) 2008-2020 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
19 #if USE_ISOC_THREADS || USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS || USE_WINDOWS_THREADS
21 /* Which tests to perform.
22 Uncomment some of these, to verify that all tests crash if no locking
24 #define DO_TEST_COND 1
25 #define DO_TEST_TIMEDCOND 1
28 /* Whether to help the scheduler through explicit yield().
29 Uncomment this to see if the operating system has a fair scheduler. */
30 #define EXPLICIT_YIELD 1
32 /* Whether to print debugging messages. */
33 #define ENABLE_DEBUGGING 0
41 #include "glthread/cond.h"
42 #include "glthread/lock.h"
43 #include "glthread/thread.h"
44 #include "glthread/yield.h"
47 # define dbgprintf printf
49 # define dbgprintf if (0) printf
53 # define yield() gl_thread_yield ()
62 static int cond_value
= 0;
63 gl_cond_define_initialized(static, condtest
)
64 gl_lock_define_initialized(static, lockcond
)
67 cond_routine (void *arg
)
69 gl_lock_lock (lockcond
);
72 gl_cond_wait (condtest
, lockcond
);
74 gl_lock_unlock (lockcond
);
89 thread
= gl_thread_create (cond_routine
, NULL
);
93 remain
= sleep (remain
);
97 /* signal condition */
98 gl_lock_lock (lockcond
);
100 gl_cond_signal (condtest
);
101 gl_lock_unlock (lockcond
);
103 gl_thread_join (thread
, NULL
);
111 * Timed Condition check
113 static int cond_timeout
;
116 get_ts (struct timespec
*ts
)
120 gettimeofday (&now
, NULL
);
122 ts
->tv_sec
= now
.tv_sec
+ 1;
123 ts
->tv_nsec
= now
.tv_usec
* 1000;
127 timedcond_routine (void *arg
)
132 gl_lock_lock (lockcond
);
136 ret
= glthread_cond_timedwait (&condtest
, &lockcond
, &ts
);
137 if (ret
== ETIMEDOUT
)
140 gl_lock_unlock (lockcond
);
146 test_timedcond (void)
151 cond_value
= cond_timeout
= 0;
153 thread
= gl_thread_create (timedcond_routine
, NULL
);
157 remain
= sleep (remain
);
161 /* signal condition */
162 gl_lock_lock (lockcond
);
164 gl_cond_signal (condtest
);
165 gl_lock_unlock (lockcond
);
167 gl_thread_join (thread
, NULL
);
177 printf ("Starting test_cond ..."); fflush (stdout
);
179 printf (" OK\n"); fflush (stdout
);
181 #if DO_TEST_TIMEDCOND
182 printf ("Starting test_timedcond ..."); fflush (stdout
);
184 printf (" OK\n"); fflush (stdout
);
192 /* No multithreading available. */
199 fputs ("Skipping test: multithreading not enabled\n", stderr
);