28 #ifdef MHD_USE_W32_THREADS 29 #include "mhd_limits.h" 32 #ifdef MHD_USE_THREAD_NAME_ 36 #ifdef HAVE_PTHREAD_NP_H 37 #include <pthread_np.h> 44 #ifndef MHD_USE_THREAD_NAME_ 46 #define MHD_set_thread_name_(t, n) (void) 47 #define MHD_set_cur_thread_name_(n) (void) 51 #if defined(MHD_USE_POSIX_THREADS) 52 #if defined(HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD) || \ 53 defined(HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI) 54 # define MHD_USE_THREAD_ATTR_SETNAME 1 58 #if defined(HAVE_PTHREAD_SETNAME_NP_GNU) || \ 59 defined(HAVE_PTHREAD_SET_NAME_NP_FREEBSD) \ 60 || defined(HAVE_PTHREAD_SETNAME_NP_NETBSD) 71 const char *thread_name)
73 if (
NULL == thread_name)
76 #if defined(HAVE_PTHREAD_SETNAME_NP_GNU) 77 return ! pthread_setname_np (thread_id, thread_name);
78 #elif defined(HAVE_PTHREAD_SET_NAME_NP_FREEBSD) 80 pthread_set_name_np (thread_id, thread_name);
82 #elif defined(HAVE_PTHREAD_SETNAME_NP_NETBSD) 88 return ! pthread_setname_np (thread_id, thread_name, 0);
99 #define MHD_set_cur_thread_name_(n) MHD_set_thread_name_ (pthread_self (),(n)) 102 #define MHD_set_cur_thread_name_(n) MHD_set_thread_name_ (0,(n)) 104 #elif defined(HAVE_PTHREAD_SETNAME_NP_DARWIN) 111 #define MHD_set_cur_thread_name_(n) (! (pthread_setname_np ((n)))) 114 #elif defined(MHD_USE_W32_THREADS) 115 #ifndef _MSC_FULL_VER 127 const char *thread_name)
129 static const DWORD VC_SETNAME_EXC = 0x406D1388;
131 struct thread_info_struct
140 if (
NULL == thread_name)
143 thread_info.type = 0x1000;
144 thread_info.name = thread_name;
145 thread_info.ID = thread_id;
146 thread_info.flags = 0;
150 RaiseException (VC_SETNAME_EXC,
152 sizeof (thread_info) /
sizeof(ULONG_PTR),
153 (ULONG_PTR *) &thread_info);
155 __except (EXCEPTION_EXECUTE_HANDLER)
167 #define MHD_set_cur_thread_name_(n) \ 168 MHD_set_thread_name_ ((MHD_thread_ID_native_) -1,(n)) 192 #if defined(MHD_USE_POSIX_THREADS) 194 #if defined(MHD_thread_handle_ID_get_native_handle_ptr_) 195 pthread_t *
const new_tid_ptr =
196 MHD_thread_handle_ID_get_native_handle_ptr_ (handle_id);
199 pthread_t *
const new_tid_ptr = &new_tid;
207 res = pthread_attr_init (&attr);
210 res = pthread_attr_setstacksize (&attr,
213 res = pthread_create (new_tid_ptr,
217 pthread_attr_destroy (&attr);
221 res = pthread_create (new_tid_ptr,
231 #if ! defined(MHD_thread_handle_ID_get_native_handle_ptr_) 237 #elif defined(MHD_USE_W32_THREADS) 238 uintptr_t thr_handle;
239 #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_INT 249 thr_handle = (uintptr_t) _beginthreadex (
NULL,
250 (
unsigned int) stack_size,
255 if ((MHD_thread_handle_native_) 0 == (MHD_thread_handle_native_) thr_handle)
259 (MHD_thread_handle_native_) \
267 #ifdef MHD_USE_THREAD_NAME_ 269 #ifndef MHD_USE_THREAD_ATTR_SETNAME 270 struct MHD_named_helper_param_
289 static MHD_THRD_RTRN_TYPE_ MHD_THRD_CALL_SPEC_
290 named_thread_starter (
void *
data)
292 struct MHD_named_helper_param_ *
const param =
293 (
struct MHD_named_helper_param_ *)
data;
298 return (MHD_THRD_RTRN_TYPE_) 0;
303 thr_func = param->start_routine;
306 return thr_func (arg);
325 const char *thread_name,
330 #if defined(MHD_USE_THREAD_ATTR_SETNAME) 333 #if defined(MHD_thread_handle_ID_get_native_handle_ptr_) 334 pthread_t *
const new_tid_ptr =
335 MHD_thread_handle_ID_get_native_handle_ptr_ (handle_id);
338 pthread_t *
const new_tid_ptr = &new_tid;
341 res = pthread_attr_init (&attr);
344 #if defined(HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD) 350 res = pthread_attr_setname_np (&attr,
353 #elif defined(HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI) 354 res = pthread_attr_setname_np (&attr,
357 #error No pthread_attr_setname_np() function. 359 if ((res == 0) && (0 != stack_size) )
360 res = pthread_attr_setstacksize (&attr,
363 res = pthread_create (new_tid_ptr,
367 pthread_attr_destroy (&attr);
374 #if ! defined(MHD_thread_handle_ID_get_native_handle_ptr_) 381 struct MHD_named_helper_param_ *param;
383 if (
NULL == thread_name)
389 param = malloc (
sizeof (
struct MHD_named_helper_param_));
393 param->start_routine = start_routine;
395 param->name = thread_name;
402 &named_thread_starter,
#define MHD_thread_handle_ID_is_valid_handle_(hndl_id)
#define MHD_set_thread_name_(t, n)
MHD_THRD_RTRN_TYPE_(MHD_THRD_CALL_SPEC_ * MHD_THREAD_START_ROUTINE_)(void *cls)
#define MHD_thread_handle_ID_set_invalid_(hndl_id_ptr)
#define MHD_set_cur_thread_name_(n)
#define MHD_create_named_thread_(t, n, s, r, a)
int MHD_create_thread_(MHD_thread_handle_ID_ *thread, size_t stack_size, MHD_THREAD_START_ROUTINE_ start_routine, void *arg)
#define MHD_thread_handle_ID_set_native_handle_(hndl_id_ptr, native_val)
Header for platform-independent threads abstraction.