- return pthread_detach( thread );
-}
-
-
-/* pipe_mutex
- */
-typedef pthread_mutex_t pipe_mutex;
-
-#define pipe_static_mutex(mutex) \
- static pipe_mutex mutex = PTHREAD_MUTEX_INITIALIZER
-
-#define pipe_mutex_init(mutex) \
- (void) pthread_mutex_init(&(mutex), NULL)
-
-#define pipe_mutex_destroy(mutex) \
- pthread_mutex_destroy(&(mutex))
-
-#define pipe_mutex_lock(mutex) \
- (void) pthread_mutex_lock(&(mutex))
-
-#define pipe_mutex_unlock(mutex) \
- (void) pthread_mutex_unlock(&(mutex))
-
-
-/* pipe_condvar
- */
-typedef pthread_cond_t pipe_condvar;
-
-#define pipe_static_condvar(mutex) \
- static pipe_condvar mutex = PTHREAD_COND_INITIALIZER
-
-#define pipe_condvar_init(cond) \
- pthread_cond_init(&(cond), NULL)
-
-#define pipe_condvar_destroy(cond) \
- pthread_cond_destroy(&(cond))
-
-#define pipe_condvar_wait(cond, mutex) \
- pthread_cond_wait(&(cond), &(mutex))
-
-#define pipe_condvar_signal(cond) \
- pthread_cond_signal(&(cond))
-
-#define pipe_condvar_broadcast(cond) \
- pthread_cond_broadcast(&(cond))
-
-
-
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
-
-#include <windows.h>
-
-/* pipe_thread
- */
-typedef HANDLE pipe_thread;
-
-#define PIPE_THREAD_ROUTINE( name, param ) \
- void * WINAPI name( void *param )
-
-static INLINE pipe_thread pipe_thread_create( void *(WINAPI * routine)( void *), void *param )
-{
- DWORD id;
- return CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) routine, param, 0, &id );
-}
-
-static INLINE int pipe_thread_wait( pipe_thread thread )
-{
- if (WaitForSingleObject( thread, INFINITE ) == WAIT_OBJECT_0)
- return 0;
- return -1;
-}
-
-static INLINE int pipe_thread_destroy( pipe_thread thread )
-{
- if (CloseHandle( thread ))
- return 0;
- return -1;
-}
-
-
-/* pipe_mutex
- */
-typedef CRITICAL_SECTION pipe_mutex;
-
-/* http://locklessinc.com/articles/pthreads_on_windows/ */
-#define pipe_static_mutex(mutex) \
- static pipe_mutex mutex = {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0}
-
-#define pipe_mutex_init(mutex) \
- InitializeCriticalSection(&mutex)
-
-#define pipe_mutex_destroy(mutex) \
- DeleteCriticalSection(&mutex)
-
-#define pipe_mutex_lock(mutex) \
- EnterCriticalSection(&mutex)
-
-#define pipe_mutex_unlock(mutex) \
- LeaveCriticalSection(&mutex)
-
-/* TODO: Need a macro to declare "I don't care about WinXP compatibilty" */
-#if 0 && defined (_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
-/* CONDITION_VARIABLE is only available on newer versions of Windows
- * (Server 2008/Vista or later).
- * http://msdn.microsoft.com/en-us/library/ms682052(VS.85).aspx
- *
- * pipe_condvar
- */
-typedef CONDITION_VARIABLE pipe_condvar;
-
-#define pipe_static_condvar(cond) \
- /*static*/ pipe_condvar cond = CONDITION_VARIABLE_INIT
-
-#define pipe_condvar_init(cond) \
- InitializeConditionVariable(&(cond))
-
-#define pipe_condvar_destroy(cond) \
- (void) cond /* nothing to do */
-
-#define pipe_condvar_wait(cond, mutex) \
- SleepConditionVariableCS(&(cond), &(mutex), INFINITE)
-
-#define pipe_condvar_signal(cond) \
- WakeConditionVariable(&(cond))
-
-#define pipe_condvar_broadcast(cond) \
- WakeAllConditionVariable(&(cond))
-
-#else /* need compatibility with pre-Vista Win32 */
-
-/* pipe_condvar (XXX FIX THIS)
- * See http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
- * for potential pitfalls in implementation.
- */
-typedef DWORD pipe_condvar;
-
-#define pipe_static_condvar(cond) \
- /*static*/ pipe_condvar cond = 1
-
-#define pipe_condvar_init(cond) \
- (void) (cond = 1)
-
-#define pipe_condvar_destroy(cond) \
- (void) cond
-
-/* Poor man's pthread_cond_wait():
- Just release the mutex and sleep for one millisecond.
- The caller's while() loop does all the work. */
-#define pipe_condvar_wait(cond, mutex) \
- do { pipe_mutex_unlock(mutex); \
- Sleep(cond); \
- pipe_mutex_lock(mutex); \
- } while (0)
-
-#define pipe_condvar_signal(cond) \
- (void) cond
-
-#define pipe_condvar_broadcast(cond) \
- (void) cond
-
-#endif /* pre-Vista win32 */
-