-#if TEST_POSIX_THREADS
-# include <pthread.h>
-# include <sched.h>
-typedef pthread_t gl_thread_t;
-static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
-{
- pthread_t thread;
- if (pthread_create (&thread, NULL, func, arg) != 0)
- abort ();
- return thread;
-}
-static inline void gl_thread_join (gl_thread_t thread)
-{
- void *retval;
- if (pthread_join (thread, &retval) != 0)
- abort ();
-}
-static inline void gl_thread_yield (void)
-{
- sched_yield ();
-}
-static inline void * gl_thread_self (void)
-{
- return (void *) pthread_self ();
-}
-#endif
-#if TEST_PTH_THREADS
-# include <pth.h>
-typedef pth_t gl_thread_t;
-static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
-{
- pth_t thread = pth_spawn (NULL, func, arg);
- if (thread == NULL)
- abort ();
- return thread;
-}
-static inline void gl_thread_join (gl_thread_t thread)
-{
- if (!pth_join (thread, NULL))
- abort ();
-}
-static inline void gl_thread_yield (void)
-{
- pth_yield (NULL);
-}
-static inline void * gl_thread_self (void)
-{
- return pth_self ();
-}
-#endif
-#if TEST_SOLARIS_THREADS
-# include <thread.h>
-typedef thread_t gl_thread_t;
-static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
-{
- thread_t thread;
- if (thr_create (NULL, 0, func, arg, 0, &thread) != 0)
- abort ();
- return thread;
-}
-static inline void gl_thread_join (gl_thread_t thread)
-{
- void *retval;
- if (thr_join (thread, NULL, &retval) != 0)
- abort ();
-}
-static inline void gl_thread_yield (void)
-{
- thr_yield ();
-}
-static inline void * gl_thread_self (void)
-{
- return (void *) thr_self ();
-}
-#endif
-#if TEST_WIN32_THREADS
-# include <windows.h>
-typedef HANDLE gl_thread_t;
-/* Use a wrapper function, instead of adding WINAPI through a cast. */
-struct wrapper_args { void * (*func) (void *); void *arg; };
-static DWORD WINAPI wrapper_func (void *varg)
-{
- struct wrapper_args *warg = (struct wrapper_args *)varg;
- void * (*func) (void *) = warg->func;
- void *arg = warg->arg;
- free (warg);
- func (arg);
- return 0;
-}
-static inline gl_thread_t gl_thread_create (void * (*func) (void *), void *arg)
-{
- struct wrapper_args *warg =
- (struct wrapper_args *) malloc (sizeof (struct wrapper_args));
- if (warg == NULL)
- abort ();
- warg->func = func;
- warg->arg = arg;
- {
- DWORD thread_id;
- HANDLE thread =
- CreateThread (NULL, 100000, wrapper_func, warg, 0, &thread_id);
- if (thread == NULL)
- abort ();
- return thread;
- }
-}
-static inline void gl_thread_join (gl_thread_t thread)
-{
- if (WaitForSingleObject (thread, INFINITE) == WAIT_FAILED)
- abort ();
- if (!CloseHandle (thread))
- abort ();
-}
-static inline void gl_thread_yield (void)
-{
- Sleep (0);
-}
-static inline void * gl_thread_self (void)
-{
- return (void *) GetCurrentThreadId ();
-}
-#endif