annotate tests/test-cond.c @ 40186:8964917f9574

autoupdate
author Karl Berry <karl@freefriends.org>
date Mon, 18 Feb 2019 08:02:49 -0800
parents b06060465f09
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
1 /* Test of condition variables in multithreaded situations.
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 19642
diff changeset
2 Copyright (C) 2008-2019 Free Software Foundation, Inc.
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
3
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
4 This program is free software: you can redistribute it and/or modify
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
6 the Free Software Foundation; either version 3 of the License, or
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
7 (at your option) any later version.
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
8
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
12 GNU General Public License for more details.
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
13
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
19190
9759915b2aca all: prefer https: URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
16
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
17 #include <config.h>
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
18
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
19 #if USE_POSIX_THREADS || USE_SOLARIS_THREADS || USE_PTH_THREADS || USE_WINDOWS_THREADS
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
20
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
21 /* Which tests to perform.
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
22 Uncomment some of these, to verify that all tests crash if no locking
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
23 is enabled. */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
24 #define DO_TEST_COND 1
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
25 #define DO_TEST_TIMEDCOND 1
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
26
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
27
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
28 /* Whether to help the scheduler through explicit yield().
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
29 Uncomment this to see if the operating system has a fair scheduler. */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
30 #define EXPLICIT_YIELD 1
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
31
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
32 /* Whether to print debugging messages. */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
33 #define ENABLE_DEBUGGING 0
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
34
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
35 #include <stdio.h>
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
36 #include <stdlib.h>
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
37 #include <string.h>
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
38 #include <sys/time.h>
19642
f08439201719 cond tests: Fix compilation error on Solaris.
Bruno Haible <bruno@clisp.org>
parents: 19484
diff changeset
39 #include <unistd.h>
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
40
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
41 #include "glthread/cond.h"
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
42 #include "glthread/lock.h"
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
43 #include "glthread/thread.h"
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
44 #include "glthread/yield.h"
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
45
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
46 #if ENABLE_DEBUGGING
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
47 # define dbgprintf printf
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
48 #else
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
49 # define dbgprintf if (0) printf
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
50 #endif
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
51
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
52 #if EXPLICIT_YIELD
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
53 # define yield() gl_thread_yield ()
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
54 #else
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
55 # define yield()
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
56 #endif
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
57
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
58
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
59 /*
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
60 * Condition check
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
61 */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
62 static int cond_value = 0;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
63 gl_cond_define_initialized(static, condtest)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
64 gl_lock_define_initialized(static, lockcond)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
65
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
66 static void *
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
67 cond_routine (void *arg)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
68 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
69 gl_lock_lock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
70 while (!cond_value)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
71 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
72 gl_cond_wait (condtest, lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
73 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
74 gl_lock_unlock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
75
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
76 cond_value = 2;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
77
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
78 return NULL;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
79 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
80
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
81 void
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
82 test_cond ()
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
83 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
84 int remain = 2;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
85 gl_thread_t thread;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
86
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
87 cond_value = 0;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
88
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
89 thread = gl_thread_create (cond_routine, NULL);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
90 do
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
91 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
92 yield ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
93 remain = sleep (remain);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
94 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
95 while (remain);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
96
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
97 /* signal condition */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
98 gl_lock_lock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
99 cond_value = 1;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
100 gl_cond_signal (condtest);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
101 gl_lock_unlock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
102
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
103 gl_thread_join (thread, NULL);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
104
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
105 if (cond_value != 2)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
106 abort ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
107 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
108
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
109
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
110 /*
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
111 * Timed Condition check
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
112 */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
113 static int cond_timeout;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
114
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
115 static void
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
116 get_ts (struct timespec *ts)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
117 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
118 struct timeval now;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
119
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
120 gettimeofday (&now, NULL);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
121
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
122 ts->tv_sec = now.tv_sec + 1;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
123 ts->tv_nsec = now.tv_usec * 1000;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
124 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
125
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
126 static void *
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
127 timedcond_routine (void *arg)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
128 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
129 int ret;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
130 struct timespec ts;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
131
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
132 gl_lock_lock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
133 while (!cond_value)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
134 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
135 get_ts (&ts);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
136 ret = glthread_cond_timedwait (&condtest, &lockcond, &ts);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
137 if (ret == ETIMEDOUT)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
138 cond_timeout = 1;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
139 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
140 gl_lock_unlock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
141
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
142 return NULL;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
143 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
144
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
145 static void
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
146 test_timedcond (void)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
147 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
148 int remain = 2;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
149 gl_thread_t thread;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
150
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
151 cond_value = cond_timeout = 0;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
152
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
153 thread = gl_thread_create (timedcond_routine, NULL);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
154
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
155 remain = 2;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
156 do
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
157 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
158 yield ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
159 remain = sleep (remain);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
160 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
161 while (remain);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
162
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
163 /* signal condition */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
164 gl_lock_lock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
165 cond_value = 1;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
166 gl_cond_signal (condtest);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
167 gl_lock_unlock (lockcond);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
168
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
169 gl_thread_join (thread, NULL);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
170
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
171 if (!cond_timeout)
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
172 abort ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
173 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
174
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
175 int
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
176 main ()
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
177 {
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
178 #if TEST_PTH_THREADS
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
179 if (!pth_init ())
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
180 abort ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
181 #endif
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
182
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
183 #if DO_TEST_COND
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
184 printf ("Starting test_cond ..."); fflush (stdout);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
185 test_cond ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
186 printf (" OK\n"); fflush (stdout);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
187 #endif
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
188 #if DO_TEST_TIMEDCOND
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
189 printf ("Starting test_timedcond ..."); fflush (stdout);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
190 test_timedcond ();
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
191 printf (" OK\n"); fflush (stdout);
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
192 #endif
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
193
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
194 return 0;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
195 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
196
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
197 #else
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
198
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
199 /* No multithreading available. */
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
200
12926
f1b034447063 Fix test-cond link error.
Bruno Haible <bruno@clisp.org>
parents: 12738
diff changeset
201 #include <stdio.h>
f1b034447063 Fix test-cond link error.
Bruno Haible <bruno@clisp.org>
parents: 12738
diff changeset
202
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
203 int
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
204 main ()
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
205 {
12738
906355caec2a cond: When skipping the test, show the reason.
Bruno Haible <bruno@clisp.org>
parents: 12559
diff changeset
206 fputs ("Skipping test: multithreading not enabled\n", stderr);
10560
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
207 return 77;
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
208 }
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
209
0eefc6edf646 Tests for module 'cond'.
Yoann Vandoorselaere <yoann.v@prelude-ids.com>
parents:
diff changeset
210 #endif