1 /* Test of condition variables in multithreaded situations.
2 Copyright (C) 2008-2011 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 <http://www.gnu.org/licenses/>. */
19 #if USE_POSIX_THREADS || USE_SOLARIS_THREADS || USE_PTH_THREADS || USE_WIN32_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
40 #include "glthread/cond.h"
41 #include "glthread/lock.h"
42 #include "glthread/thread.h"
43 #include "glthread/yield.h"
46 # define dbgprintf printf
48 # define dbgprintf if (0) printf
52 # 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);
159 remain = sleep (remain);
163 /* signal condition */
164 gl_lock_lock (lockcond);
166 gl_cond_signal (condtest);
167 gl_lock_unlock (lockcond);
169 gl_thread_join (thread, NULL);
184 printf ("Starting test_cond ..."); fflush (stdout);
186 printf (" OK\n"); fflush (stdout);
188 #if DO_TEST_TIMEDCOND
189 printf ("Starting test_timedcond ..."); fflush (stdout);
191 printf (" OK\n"); fflush (stdout);
199 /* No multithreading available. */
206 fputs ("Skipping test: multithreading not enabled\n", stderr);