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)
118 typedef pthread_t MHD_thread_handle_native_;
119 #elif defined(MHD_USE_W32_THREADS)
123 typedef HANDLE MHD_thread_handle_native_;
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)
226 typedef pthread_t MHD_thread_ID_native_;
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)
243 typedef DWORD MHD_thread_ID_native_;
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
523 typedef MHD_THRD_RTRN_TYPE_
544 #ifndef MHD_USE_THREAD_NAME_
545 #define MHD_create_named_thread_(t,n,s,r,a) MHD_create_thread_ ((t),(s),(r),(a))
559 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)
additional automatic macros for MHD_config.h
struct MHD_thread_handle_struct_ MHD_thread_handle_
struct MHD_thread_ID_struct_ MHD_thread_ID_
#define MHD_create_named_thread_(t, n, s, r, a)
MHD_thread_ID_native_ native
MHD_thread_handle_native_ native
MHD_thread_handle_ handle