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>
43#ifndef MHD_USE_THREAD_NAME_
45#define MHD_set_thread_name_(t, n) (void)
46#define MHD_set_cur_thread_name_(n) (void)
50#if defined(MHD_USE_POSIX_THREADS)
51#if defined(HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD) || \
52 defined(HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI)
53# define MHD_USE_THREAD_ATTR_SETNAME 1
57#if defined(HAVE_PTHREAD_SETNAME_NP_GNU) || \
58 defined(HAVE_PTHREAD_SET_NAME_NP_FREEBSD) \
59 || defined(HAVE_PTHREAD_SETNAME_NP_NETBSD)
70 const char *thread_name)
72 if (
NULL == thread_name)
75#if defined(HAVE_PTHREAD_SETNAME_NP_GNU)
76 return ! pthread_setname_np (thread_id, thread_name);
77#elif defined(HAVE_PTHREAD_SET_NAME_NP_FREEBSD)
79 pthread_set_name_np (thread_id, thread_name);
81#elif defined(HAVE_PTHREAD_SETNAME_NP_NETBSD)
87 return ! pthread_setname_np (thread_id, thread_name, 0);
98#define MHD_set_cur_thread_name_(n) MHD_set_thread_name_ (pthread_self (),(n))
101#define MHD_set_cur_thread_name_(n) MHD_set_thread_name_ (0,(n))
103#elif defined(HAVE_PTHREAD_SETNAME_NP_DARWIN)
110#define MHD_set_cur_thread_name_(n) (! (pthread_setname_np ((n))))
113#elif defined(MHD_USE_W32_THREADS)
126 const char *thread_name)
128 static const DWORD VC_SETNAME_EXC = 0x406D1388;
130 struct thread_info_struct
139 if (
NULL == thread_name)
142 thread_info.type = 0x1000;
143 thread_info.name = thread_name;
144 thread_info.ID = thread_id;
145 thread_info.flags = 0;
149 RaiseException (VC_SETNAME_EXC,
151 sizeof (thread_info) /
sizeof(ULONG_PTR),
152 (ULONG_PTR *) &thread_info);
154 __except (EXCEPTION_EXECUTE_HANDLER)
166#define MHD_set_cur_thread_name_(n) \
167 MHD_set_thread_name_ ((MHD_thread_ID_) -1,(n))
189#if defined(MHD_USE_POSIX_THREADS)
195 res = pthread_attr_init (&attr);
198 res = pthread_attr_setstacksize (&attr,
201 res = pthread_create (&(thread->handle),
205 pthread_attr_destroy (&attr);
209 res = pthread_create (&(thread->handle),
218#elif defined(MHD_USE_W32_THREADS)
219#if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_INT
227 thread->handle = (MHD_thread_handle_)
228 _beginthreadex (
NULL,
229 (
unsigned int) stack_size,
235 if ((MHD_thread_handle_) - 1 == thread->handle)
243#ifdef MHD_USE_THREAD_NAME_
245#ifndef MHD_USE_THREAD_ATTR_SETNAME
246struct MHD_named_helper_param_
265static MHD_THRD_RTRN_TYPE_ MHD_THRD_CALL_SPEC_
266named_thread_starter (
void *
data)
268 struct MHD_named_helper_param_ *
const param =
269 (
struct MHD_named_helper_param_ *)
data;
274 return (MHD_THRD_RTRN_TYPE_) 0;
279 thr_func = param->start_routine;
282 return thr_func (arg);
301 const char *thread_name,
306#if defined(MHD_USE_THREAD_ATTR_SETNAME)
310 res = pthread_attr_init (&attr);
313#if defined(HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD)
319 res = pthread_attr_setname_np (&attr,
322#elif defined(HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI)
323 res = pthread_attr_setname_np (&attr,
326#error No pthread_attr_setname_np() function.
328 if ((res == 0) && (0 != stack_size) )
329 res = pthread_attr_setstacksize (&attr,
332 res = pthread_create (&(thread->handle),
336 pthread_attr_destroy (&attr);
343 struct MHD_named_helper_param_ *param;
345 if (
NULL == thread_name)
351 param = malloc (
sizeof (
struct MHD_named_helper_param_));
355 param->start_routine = start_routine;
357 param->name = thread_name;
364 &named_thread_starter,
int MHD_create_thread_(MHD_thread_handle_ID_ *thread, size_t stack_size, MHD_THREAD_START_ROUTINE_ start_routine, void *arg)
#define MHD_set_cur_thread_name_(n)
#define MHD_set_thread_name_(t, n)
MHD_THRD_RTRN_TYPE_(MHD_THRD_CALL_SPEC_ * MHD_THREAD_START_ROUTINE_)(void *cls)
#define MHD_create_named_thread_(t, n, s, r, a)
Header for platform-independent threads abstraction.