Mercurial > hg > octave-shane > gnulib-hg
annotate tests/test-tls.c @ 17622:71e733c62cee
savedir: add sorting arg to savedir, streamsavedir; remove fdsavedir
Patch based on an idea by Dick Streefland in
<https://savannah.gnu.org/patch/?7892>.
* NEWS: Document this.
* lib/savedir.c (NAME_SIZE_DEFAULT): Remove.
(direntry_t, comparison_function): New types.
(direntry_cmp_name): New function.
(direntry_cmp_inode) [D_INO_IN_DIRENT]: New function.
(streamsavedir, savedir): New arg OPTION.
(streamsavedir): Simplify memory allocation.
(fdsavedir): Remove.
* lib/savedir.h (enum savedir_option): New type.
(streamsavedir, savedir): New arg OPTION.
(fdsavedir): Remove.
author | Sergey Poznyakoff <gray@gnu.org.ua> |
---|---|
date | Thu, 13 Feb 2014 22:01:39 +0200 |
parents | 344018b6e5d7 |
children |
rev | line source |
---|---|
6115 | 1 /* Test of thread-local storage in multithreaded situations. |
17587 | 2 Copyright (C) 2005, 2008-2014 Free Software Foundation, Inc. |
6115 | 3 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8891
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
6115
diff
changeset
|
5 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8891
diff
changeset
|
6 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8891
diff
changeset
|
7 (at your option) any later version. |
6115 | 8 |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
6115
diff
changeset
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
6115
diff
changeset
|
12 GNU General Public License for more details. |
6115 | 13 |
7139
adb21c293305
Add copyright notices to long-enough files that lack them, since
Paul Eggert <eggert@cs.ucla.edu>
parents:
6115
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8891
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
6115 | 16 |
17 /* Written by Bruno Haible <bruno@clisp.org>, 2005. */ | |
18 | |
8891
633babea5f62
Unconditionally include <config.h> in unit tests.
Eric Blake <ebb9@byu.net>
parents:
7139
diff
changeset
|
19 #include <config.h> |
6115 | 20 |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
21 #if USE_POSIX_THREADS || USE_SOLARIS_THREADS || USE_PTH_THREADS || USE_WINDOWS_THREADS |
6115 | 22 |
23 #if USE_POSIX_THREADS | |
24 # define TEST_POSIX_THREADS 1 | |
25 #endif | |
26 #if USE_SOLARIS_THREADS | |
27 # define TEST_SOLARIS_THREADS 1 | |
28 #endif | |
29 #if USE_PTH_THREADS | |
30 # define TEST_PTH_THREADS 1 | |
31 #endif | |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
32 #if USE_WINDOWS_THREADS |
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
33 # define TEST_WINDOWS_THREADS 1 |
6115 | 34 #endif |
35 | |
36 /* Whether to help the scheduler through explicit yield(). | |
37 Uncomment this to see if the operating system has a fair scheduler. */ | |
38 #define EXPLICIT_YIELD 1 | |
39 | |
40 /* Whether to print debugging messages. */ | |
41 #define ENABLE_DEBUGGING 0 | |
42 | |
43 /* Number of simultaneous threads. */ | |
44 #define THREAD_COUNT 16 | |
45 | |
46 /* Number of operations performed in each thread. */ | |
47 #define REPEAT_COUNT 50000 | |
48 | |
49 #include <stdio.h> | |
50 #include <stdlib.h> | |
51 #include <string.h> | |
52 | |
10318
8a3539888308
Move the lock and tls source files into a subdirectory.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
53 #include "glthread/tls.h" |
10556
d6619672e1a6
Make use of the modules 'thread', 'yield' in the 'tls' test.
Bruno Haible <bruno@clisp.org>
parents:
10461
diff
changeset
|
54 #include "glthread/thread.h" |
d6619672e1a6
Make use of the modules 'thread', 'yield' in the 'tls' test.
Bruno Haible <bruno@clisp.org>
parents:
10461
diff
changeset
|
55 #include "glthread/yield.h" |
6115 | 56 |
57 #if ENABLE_DEBUGGING | |
58 # define dbgprintf printf | |
59 #else | |
60 # define dbgprintf if (0) printf | |
61 #endif | |
62 | |
63 #if EXPLICIT_YIELD | |
64 # define yield() gl_thread_yield () | |
65 #else | |
66 # define yield() | |
67 #endif | |
68 | |
17096
14a45e05c23c
tls-tests: omit unnecessary 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
16214
diff
changeset
|
69 static void |
6115 | 70 perhaps_yield (void) |
71 { | |
72 /* Call yield () only with a certain probability, otherwise with GNU Pth | |
73 the sequence of thread activations is too predictable. */ | |
74 if ((((unsigned int) rand () >> 3) % 4) == 0) | |
75 yield (); | |
76 } | |
77 | |
10858
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
78 |
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
79 /* ----------------------- Test thread-local storage ----------------------- */ |
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
80 |
6115 | 81 #define KEYS_COUNT 4 |
82 | |
83 static gl_tls_key_t mykeys[KEYS_COUNT]; | |
84 | |
85 static void * | |
86 worker_thread (void *arg) | |
87 { | |
88 unsigned int id = (unsigned int) (unsigned long) arg; | |
89 int i, j, repeat; | |
90 unsigned int values[KEYS_COUNT]; | |
91 | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
92 dbgprintf ("Worker %p started\n", gl_thread_self_pointer ()); |
6115 | 93 |
94 /* Initialize the per-thread storage. */ | |
95 for (i = 0; i < KEYS_COUNT; i++) | |
96 { | |
13051 | 97 values[i] = (((unsigned int) rand () >> 3) % 1000000) * THREAD_COUNT + id; |
6115 | 98 /* Hopefully no arithmetic overflow. */ |
99 if ((values[i] % THREAD_COUNT) != id) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
100 abort (); |
6115 | 101 } |
102 perhaps_yield (); | |
103 | |
104 /* Verify that the initial value is NULL. */ | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
105 dbgprintf ("Worker %p before initial verify\n", gl_thread_self_pointer ()); |
6115 | 106 for (i = 0; i < KEYS_COUNT; i++) |
107 if (gl_tls_get (mykeys[i]) != NULL) | |
108 abort (); | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
109 dbgprintf ("Worker %p after initial verify\n", gl_thread_self_pointer ()); |
6115 | 110 perhaps_yield (); |
111 | |
112 /* Initialize the per-thread storage. */ | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
113 dbgprintf ("Worker %p before first tls_set\n", gl_thread_self_pointer ()); |
6115 | 114 for (i = 0; i < KEYS_COUNT; i++) |
115 { | |
116 unsigned int *ptr = (unsigned int *) malloc (sizeof (unsigned int)); | |
117 *ptr = values[i]; | |
118 gl_tls_set (mykeys[i], ptr); | |
119 } | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
120 dbgprintf ("Worker %p after first tls_set\n", gl_thread_self_pointer ()); |
6115 | 121 perhaps_yield (); |
122 | |
123 /* Shuffle around the pointers. */ | |
124 for (repeat = REPEAT_COUNT; repeat > 0; repeat--) | |
125 { | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
126 dbgprintf ("Worker %p doing value swapping\n", gl_thread_self_pointer ()); |
13051 | 127 i = ((unsigned int) rand () >> 3) % KEYS_COUNT; |
128 j = ((unsigned int) rand () >> 3) % KEYS_COUNT; | |
6115 | 129 if (i != j) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
130 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
131 void *vi = gl_tls_get (mykeys[i]); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
132 void *vj = gl_tls_get (mykeys[j]); |
6115 | 133 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
134 gl_tls_set (mykeys[i], vj); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
135 gl_tls_set (mykeys[j], vi); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
136 } |
6115 | 137 perhaps_yield (); |
138 } | |
139 | |
140 /* Verify that all the values are from this thread. */ | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
141 dbgprintf ("Worker %p before final verify\n", gl_thread_self_pointer ()); |
6115 | 142 for (i = 0; i < KEYS_COUNT; i++) |
143 if ((*(unsigned int *) gl_tls_get (mykeys[i]) % THREAD_COUNT) != id) | |
144 abort (); | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
145 dbgprintf ("Worker %p after final verify\n", gl_thread_self_pointer ()); |
6115 | 146 perhaps_yield (); |
147 | |
14901
4b26d9ce6840
thread: Support pthreads-win32.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
148 dbgprintf ("Worker %p dying.\n", gl_thread_self_pointer ()); |
6115 | 149 return NULL; |
150 } | |
151 | |
10858
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
152 static void |
6115 | 153 test_tls (void) |
154 { | |
155 int pass, i; | |
156 | |
157 for (pass = 0; pass < 2; pass++) | |
158 { | |
159 gl_thread_t threads[THREAD_COUNT]; | |
160 | |
161 if (pass == 0) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
162 for (i = 0; i < KEYS_COUNT; i++) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
163 gl_tls_key_init (mykeys[i], free); |
6115 | 164 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
165 for (i = KEYS_COUNT - 1; i >= 0; i--) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
166 gl_tls_key_init (mykeys[i], free); |
6115 | 167 |
168 /* Spawn the threads. */ | |
169 for (i = 0; i < THREAD_COUNT; i++) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
170 threads[i] = gl_thread_create (worker_thread, NULL); |
6115 | 171 |
172 /* Wait for the threads to terminate. */ | |
173 for (i = 0; i < THREAD_COUNT; i++) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
174 gl_thread_join (threads[i], NULL); |
6115 | 175 |
176 for (i = 0; i < KEYS_COUNT; i++) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10858
diff
changeset
|
177 gl_tls_key_destroy (mykeys[i]); |
6115 | 178 } |
179 } | |
180 | |
10858
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
181 |
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
182 /* -------------------------------------------------------------------------- */ |
fbae6908522f
Avoid gcc -Wmissing-prototypes warnings.
Bruno Haible <bruno@clisp.org>
parents:
10556
diff
changeset
|
183 |
6115 | 184 int |
185 main () | |
186 { | |
187 #if TEST_PTH_THREADS | |
188 if (!pth_init ()) | |
189 abort (); | |
190 #endif | |
191 | |
192 printf ("Starting test_tls ..."); fflush (stdout); | |
193 test_tls (); | |
194 printf (" OK\n"); fflush (stdout); | |
195 | |
196 return 0; | |
197 } | |
198 | |
199 #else | |
200 | |
201 /* No multithreading available. */ | |
202 | |
10353
a34661f8b5c8
test-lock, test-tls: mention why a test is skipped
Eric Blake <ebb9@byu.net>
parents:
10318
diff
changeset
|
203 #include <stdio.h> |
a34661f8b5c8
test-lock, test-tls: mention why a test is skipped
Eric Blake <ebb9@byu.net>
parents:
10318
diff
changeset
|
204 |
6115 | 205 int |
206 main () | |
207 { | |
10461 | 208 fputs ("Skipping test: multithreading not enabled\n", stderr); |
6115 | 209 return 77; |
210 } | |
211 | |
212 #endif |