37#define MHD_THREADS_H 1
42#elif defined(HAVE_STDLIB_H)
48#if defined(MHD_USE_POSIX_THREADS)
51# define HAVE_CONFIG_H 1
52# ifndef MHD_USE_THREADS
53# define MHD_USE_THREADS 1
55#elif defined(MHD_USE_W32_THREADS)
56# ifndef WIN32_LEAN_AND_MEAN
57# define WIN32_LEAN_AND_MEAN 1
60# ifndef MHD_USE_THREADS
61# define MHD_USE_THREADS 1
64# error No threading API is available.
71#if defined(MHD_USE_POSIX_THREADS) && defined(MHD_USE_W32_THREADS)
72# error Both MHD_USE_POSIX_THREADS and MHD_USE_W32_THREADS are defined
75#ifndef MHD_NO_THREAD_NAMES
76# if defined(MHD_USE_POSIX_THREADS)
77# if defined(HAVE_PTHREAD_SETNAME_NP_GNU) || \
78 defined(HAVE_PTHREAD_SET_NAME_NP_FREEBSD) || \
79 defined(HAVE_PTHREAD_SETNAME_NP_DARWIN) || \
80 defined(HAVE_PTHREAD_SETNAME_NP_NETBSD) || \
81 defined(HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD) || \
82 defined(HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI)
83# define MHD_USE_THREAD_NAME_
85# elif defined(MHD_USE_W32_THREADS)
88# define MHD_USE_THREAD_NAME_
95#if defined(MHD_USE_POSIX_THREADS)
101# define MHD_join_thread_(native_handle) \
102 (! pthread_join ((native_handle), NULL))
103#elif defined(MHD_USE_W32_THREADS)
109# define MHD_join_thread_(native_handle) \
110 ( (WAIT_OBJECT_0 == WaitForSingleObject ( (native_handle), INFINITE)) ? \
111 (CloseHandle ( (native_handle)), ! 0) : 0 )
114#if defined(MHD_USE_POSIX_THREADS)
119#elif defined(MHD_USE_W32_THREADS)
126#if defined(MHD_USE_POSIX_THREADS)
127# if defined(__gnu_linux__) || \
128 (defined(__linux__) && defined(__GLIBC__))
136# define MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_ \
137 ((MHD_thread_handle_native_) 0)
140#elif defined(MHD_USE_W32_THREADS)
144# define MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_ \
145 ((MHD_thread_handle_native_) NULL)
148#if ! defined(MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_)
165# define MHD_thread_handle_set_invalid_(handle_ptr) \
166 ((handle_ptr)->valid = false)
171# define MHD_thread_handle_set_native_(handle_ptr,native_val) \
172 ((handle_ptr)->valid = true, (handle_ptr)->native = native_val)
176# define MHD_thread_handle_is_valid_(handle_var) \
181# define MHD_thread_handle_get_native_(handle_var) \
182 ((handle_var).native)
192# define MHD_thread_handle_set_invalid_(handle_ptr) \
193 ((*(handle_ptr)) = MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_)
198# define MHD_thread_handle_set_native_(handle_ptr,native_val) \
199 ((*(handle_ptr)) = native_val)
203# define MHD_thread_handle_is_valid_(handle_var) \
204 (MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_ != handle_var)
208# define MHD_thread_handle_get_native_(handle_var) \
215# define MHD_thread_handle_get_native_ptr_(handle_ptr) \
222#if defined(MHD_USE_POSIX_THREADS)
231# define MHD_thread_ID_native_current_ pthread_self
237# define MHD_thread_ID_native_equal_(id1,id2) \
238 (pthread_equal(id1,id2))
239#elif defined(MHD_USE_W32_THREADS)
248# define MHD_thread_ID_native_current_ GetCurrentThreadId
254# define MHD_thread_ID_native_equal_(id1,id2) \
263#define MHD_thread_ID_native_is_current_thread_(id) \
264 MHD_thread_ID_native_equal_(id, MHD_thread_ID_native_current_())
267#if defined(MHD_USE_POSIX_THREADS)
268# if defined(MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_)
272# define MHD_THREAD_ID_NATIVE_VALUE_INVALID_ \
273 MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_
275#elif defined(MHD_USE_W32_THREADS)
279 # define MHD_THREAD_ID_NATIVE_VALUE_INVALID_ \
280 ((MHD_thread_ID_native_) 0)
283#if ! defined(MHD_THREAD_ID_NATIVE_VALUE_INVALID_)
300# define MHD_thread_ID_set_invalid_(ID_ptr) \
301 ((ID_ptr)->valid = false)
306# define MHD_thread_ID_set_native_(ID_ptr,native_val) \
307 ((ID_ptr)->valid = true, (ID_ptr)->native = native_val)
311# define MHD_thread_ID_is_valid_(ID_var) \
316# define MHD_thread_ID_get_native_(ID_var) \
321# define MHD_thread_ID_is_current_thread_(ID_var) \
322 (MHD_thread_ID_is_valid_(ID_var) && \
323 MHD_thread_ID_native_is_current_thread_((ID_var).native))
333# define MHD_thread_ID_set_invalid_(ID_ptr) \
334 ((*(ID_ptr)) = MHD_THREAD_ID_NATIVE_VALUE_INVALID_)
339# define MHD_thread_ID_set_native_(ID_ptr,native_val) \
340 ((*(ID_ptr)) = native_val)
344# define MHD_thread_ID_is_valid_(ID_var) \
345 (MHD_THREAD_ID_NATIVE_VALUE_INVALID_ != ID_var)
349# define MHD_thread_ID_get_native_(ID_var) \
354# define MHD_thread_ID_is_current_thread_(ID_var) \
355 MHD_thread_ID_native_is_current_thread_(ID_var)
361# define MHD_thread_ID_set_current_thread_(ID_ptr) \
362 MHD_thread_ID_set_native_(ID_ptr,MHD_thread_ID_native_current_())
365#if defined(MHD_USE_POSIX_THREADS)
366# if defined(MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_) && \
367 ! defined(MHD_THREAD_ID_NATIVE_VALUE_INVALID_)
369 MHD_THREAD_ID_NATIVE_VALUE_INVALID_ is defined, but MHD_THREAD_ID_NATIVE_VALUE_INVALID_ is not defined
370# elif ! defined(MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_) && \
371 defined(MHD_THREAD_ID_NATIVE_VALUE_INVALID_)
373 MHD_THREAD_ID_NATIVE_VALUE_INVALID_ is not defined, but MHD_THREAD_ID_NATIVE_VALUE_INVALID_ is defined
404#if defined(MHD_USE_POSIX_THREADS) && \
405 defined(MHD_PTHREAD_CREATE__SET_ID_BEFORE_START_THREAD) && \
406 defined(MHD_THREAD_HANDLE_NATIVE_VALUE_INVALID_) && \
407 defined(MHD_THREAD_ID_NATIVE_VALUE_INVALID_) && \
408 defined(MHD_thread_handle_get_native_ptr_)
415# define MHD_THREAD_HANDLE_ID_IS_UNION 1
436#define MHD_thread_handle_ID_set_invalid_(hndl_id_ptr) \
437 (MHD_thread_handle_set_invalid_(&((hndl_id_ptr)->handle)), \
438 MHD_thread_ID_set_invalid_(&((hndl_id_ptr)->ID)))
444#define MHD_thread_handle_ID_is_valid_handle_(hndl_id) \
445 MHD_thread_handle_is_valid_((hndl_id).handle)
451#define MHD_thread_handle_ID_set_native_handle_(hndl_id_ptr,native_val) \
452 MHD_thread_handle_set_native_(&((hndl_id_ptr)->handle),native_val)
454#if defined(MHD_thread_handle_get_native_ptr_)
460# define MHD_thread_handle_ID_get_native_handle_ptr_(hndl_id_ptr) \
461 MHD_thread_handle_get_native_ptr_(&((hndl_id_ptr)->handle))
467#define MHD_thread_handle_ID_get_native_handle_(hndl_id) \
468 MHD_thread_handle_get_native_((hndl_id).handle)
474#define MHD_thread_handle_ID_is_valid_ID_(hndl_id) \
475 MHD_thread_ID_is_valid_((hndl_id).ID)
477#if defined(MHD_THREAD_HANDLE_ID_IS_UNION)
478# if defined(MHD_USE_W32_THREADS)
479# error MHD_thread_handle_ID_ cannot be a union with W32 threads
484# define MHD_thread_handle_ID_set_current_thread_ID_(hndl_id_ptr) (void) 0
489# define MHD_thread_handle_ID_set_current_thread_ID_(hndl_id_ptr) \
490 MHD_thread_ID_set_current_thread_(&((hndl_id_ptr)->ID))
498#define MHD_thread_handle_ID_is_current_thread_(hndl_id) \
499 MHD_thread_ID_is_current_thread_((hndl_id).ID)
506#define MHD_thread_handle_ID_join_thread_(hndl_id) \
507 MHD_join_thread_(MHD_thread_handle_ID_get_native_handle_(hndl_id))
509#if defined(MHD_USE_POSIX_THREADS)
510# define MHD_THRD_RTRN_TYPE_ void*
511# define MHD_THRD_CALL_SPEC_
512#elif defined(MHD_USE_W32_THREADS)
513# define MHD_THRD_RTRN_TYPE_ unsigned
514# define MHD_THRD_CALL_SPEC_ __stdcall
544#ifndef MHD_USE_THREAD_NAME_
545#define MHD_create_named_thread_(t,n,s,r,a) MHD_create_thread_ ((t),(s),(r),(a))
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
struct MHD_thread_handle_struct_ MHD_thread_handle_
struct MHD_thread_ID_struct_ MHD_thread_ID_
MHD_thread_ID_native_ native
MHD_thread_handle_native_ native
MHD_thread_handle_ handle