37#define MHD_THREADS_H 1
46#if defined(MHD_USE_POSIX_THREADS)
49# define HAVE_CONFIG_H 1
50#elif defined(MHD_USE_W32_THREADS)
51# ifndef WIN32_LEAN_AND_MEAN
52# define WIN32_LEAN_AND_MEAN 1
56# error No threading API is available.
59#ifndef MHD_NO_THREAD_NAMES
60# if defined(MHD_USE_POSIX_THREADS)
61# if defined(HAVE_PTHREAD_SETNAME_NP_GNU) || \
62 defined(HAVE_PTHREAD_SET_NAME_NP_FREEBSD) || \
63 defined(HAVE_PTHREAD_SETNAME_NP_DARWIN) || \
64 defined(HAVE_PTHREAD_SETNAME_NP_NETBSD) || \
65 defined(HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD) || \
66 defined(HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI)
67# define MHD_USE_THREAD_NAME_
69# elif defined(MHD_USE_W32_THREADS)
72# define MHD_USE_THREAD_NAME_
77#if defined(MHD_USE_POSIX_THREADS)
78typedef pthread_t MHD_thread_handle_;
79#elif defined(MHD_USE_W32_THREADS)
80typedef HANDLE MHD_thread_handle_;
83#if defined(MHD_USE_POSIX_THREADS)
84# define MHD_THRD_RTRN_TYPE_ void*
85# define MHD_THRD_CALL_SPEC_
86#elif defined(MHD_USE_W32_THREADS)
87# define MHD_THRD_RTRN_TYPE_ unsigned
88# define MHD_THRD_CALL_SPEC_ __stdcall
91#if defined(MHD_USE_POSIX_THREADS)
92typedef pthread_t MHD_thread_ID_;
93#elif defined(MHD_USE_W32_THREADS)
94typedef DWORD MHD_thread_ID_;
104#if defined(MHD_USE_POSIX_THREADS)
105# ifdef MHD_PTHREAD_CREATE__SET_ID_BEFORE_START_THREAD
106union _MHD_thread_handle_ID_
108 MHD_thread_handle_ handle;
111typedef union _MHD_thread_handle_ID_ MHD_thread_handle_ID_;
113struct _MHD_thread_handle_ID_
115 MHD_thread_handle_ handle;
118typedef struct _MHD_thread_handle_ID_ MHD_thread_handle_ID_;
120#elif defined(MHD_USE_W32_THREADS)
121struct _MHD_thread_handle_ID_
123 MHD_thread_handle_ handle;
126typedef struct _MHD_thread_handle_ID_ MHD_thread_handle_ID_;
129#if defined(MHD_USE_POSIX_THREADS)
135#define MHD_join_thread_(thread) (! pthread_join ((thread), NULL))
136#elif defined(MHD_USE_W32_THREADS)
142#define MHD_join_thread_(thread) (WAIT_OBJECT_0 == WaitForSingleObject ( \
143 (thread), INFINITE) ? (CloseHandle ( \
148#if defined(MHD_USE_POSIX_THREADS)
154#define MHD_thread_ID_match_current_(ID) (pthread_equal ((ID), pthread_self ()))
155#elif defined(MHD_USE_W32_THREADS)
161#define MHD_thread_ID_match_current_(ID) (GetCurrentThreadId () == (ID))
164#if defined(MHD_USE_POSIX_THREADS)
165# ifdef MHD_PTHREAD_CREATE__SET_ID_BEFORE_START_THREAD
170#define MHD_thread_init_(thread_handle_ID_ptr) (void) 0
176#define MHD_thread_init_(thread_handle_ID_ptr) ((thread_handle_ID_ptr)->ID = \
179#elif defined(MHD_USE_W32_THREADS)
184#define MHD_thread_init_(thread_handle_ID_ptr) ((thread_handle_ID_ptr)->ID = \
185 GetCurrentThreadId ())
194typedef MHD_THRD_RTRN_TYPE_
215#ifndef MHD_USE_THREAD_NAME_
216#define MHD_create_named_thread_(t,n,s,r,a) MHD_create_thread_ ((t),(s),(r),(a))
230 const char *thread_name,
int MHD_create_thread_(MHD_thread_handle_ID_ *thread, size_t stack_size, MHD_THREAD_START_ROUTINE_ start_routine, void *arg)
MHD_THRD_RTRN_TYPE_(MHD_THRD_CALL_SPEC_ * MHD_THREAD_START_ROUTINE_)(void *cls)
#define MHD_create_named_thread_(t, n, s, r, a)
additional automatic macros for MHD_config.h