58
60
# define dbgprintf if (0) printf
61
#if TEST_POSIX_THREADS
64
typedef pthread_t gl_thread_t;
65
static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
68
if (pthread_create (&thread, NULL, func, arg) != 0)
72
static inline void gl_thread_join (gl_thread_t thread)
75
if (pthread_join (thread, &retval) != 0)
78
static inline void gl_thread_yield (void)
82
static inline void * gl_thread_self (void)
84
return (void *) pthread_self ();
89
typedef pth_t gl_thread_t;
90
static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
92
pth_t thread = pth_spawn (NULL, func, arg);
97
static inline void gl_thread_join (gl_thread_t thread)
99
if (!pth_join (thread, NULL))
102
static inline void gl_thread_yield (void)
106
static inline void * gl_thread_self (void)
111
#if TEST_SOLARIS_THREADS
113
typedef thread_t gl_thread_t;
114
static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
117
if (thr_create (NULL, 0, func, arg, 0, &thread) != 0)
121
static inline void gl_thread_join (gl_thread_t thread)
124
if (thr_join (thread, NULL, &retval) != 0)
127
static inline void gl_thread_yield (void)
131
static inline void * gl_thread_self (void)
133
return (void *) thr_self ();
136
#if TEST_WIN32_THREADS
137
# include <windows.h>
138
typedef HANDLE gl_thread_t;
139
/* Use a wrapper function, instead of adding WINAPI through a cast. */
140
struct wrapper_args { void * (*func) (void *); void *arg; };
141
static DWORD WINAPI wrapper_func (void *varg)
143
struct wrapper_args *warg = (struct wrapper_args *)varg;
144
void * (*func) (void *) = warg->func;
145
void *arg = warg->arg;
150
static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
152
struct wrapper_args *warg =
153
(struct wrapper_args *) malloc (sizeof (struct wrapper_args));
161
CreateThread (NULL, 100000, wrapper_func, warg, 0, &thread_id);
167
static inline void gl_thread_join (gl_thread_t thread)
169
if (WaitForSingleObject (thread, INFINITE) == WAIT_FAILED)
171
if (!CloseHandle (thread))
174
static inline void gl_thread_yield (void)
178
static inline void * gl_thread_self (void)
180
return (void *) GetCurrentThreadId ();
183
63
#if EXPLICIT_YIELD
184
64
# define yield() gl_thread_yield ()
241
124
for (repeat = REPEAT_COUNT; repeat > 0; repeat--)
243
126
dbgprintf ("Worker %p doing value swapping\n", gl_thread_self ());
244
i = ((unsigned int) rand() >> 3) % KEYS_COUNT;
245
j = ((unsigned int) rand() >> 3) % KEYS_COUNT;
127
i = ((unsigned int) rand () >> 3) % KEYS_COUNT;
128
j = ((unsigned int) rand () >> 3) % KEYS_COUNT;
248
void *vi = gl_tls_get (mykeys[i]);
249
void *vj = gl_tls_get (mykeys[j]);
131
void *vi = gl_tls_get (mykeys[i]);
132
void *vj = gl_tls_get (mykeys[j]);
251
gl_tls_set (mykeys[i], vj);
252
gl_tls_set (mykeys[j], vi);
134
gl_tls_set (mykeys[i], vj);
135
gl_tls_set (mykeys[j], vi);
254
137
perhaps_yield ();
276
159
gl_thread_t threads[THREAD_COUNT];
279
for (i = 0; i < KEYS_COUNT; i++)
280
gl_tls_key_init (mykeys[i], free);
162
for (i = 0; i < KEYS_COUNT; i++)
163
gl_tls_key_init (mykeys[i], free);
282
for (i = KEYS_COUNT - 1; i >= 0; i--)
283
gl_tls_key_init (mykeys[i], free);
165
for (i = KEYS_COUNT - 1; i >= 0; i--)
166
gl_tls_key_init (mykeys[i], free);
285
168
/* Spawn the threads. */
286
169
for (i = 0; i < THREAD_COUNT; i++)
287
threads[i] = gl_thread_create (worker_thread, NULL);
170
threads[i] = gl_thread_create (worker_thread, NULL);
289
172
/* Wait for the threads to terminate. */
290
173
for (i = 0; i < THREAD_COUNT; i++)
291
gl_thread_join (threads[i]);
174
gl_thread_join (threads[i], NULL);
293
176
for (i = 0; i < KEYS_COUNT; i++)
294
gl_tls_key_destroy (mykeys[i]);
177
gl_tls_key_destroy (mykeys[i]);
182
/* -------------------------------------------------------------------------- */