diff options
Diffstat (limited to 'src/threading.c')
-rw-r--r-- | src/threading.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/src/threading.c b/src/threading.c index 7cd8da3..3bcf6cd 100644 --- a/src/threading.c +++ b/src/threading.c | |||
@@ -303,6 +303,41 @@ bool_t THREAD_WAIT_IMPL( THREAD_T *ref, double secs) | |||
303 | if (!TerminateThread( *ref, 0 )) FAIL("TerminateThread", GetLastError()); | 303 | if (!TerminateThread( *ref, 0 )) FAIL("TerminateThread", GetLastError()); |
304 | *ref= NULL; | 304 | *ref= NULL; |
305 | } | 305 | } |
306 | |||
307 | #if !defined __GNUC__ | ||
308 | //see http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx | ||
309 | #define MS_VC_EXCEPTION 0x406D1388 | ||
310 | #pragma pack(push,8) | ||
311 | typedef struct tagTHREADNAME_INFO | ||
312 | { | ||
313 | DWORD dwType; // Must be 0x1000. | ||
314 | LPCSTR szName; // Pointer to name (in user addr space). | ||
315 | DWORD dwThreadID; // Thread ID (-1=caller thread). | ||
316 | DWORD dwFlags; // Reserved for future use, must be zero. | ||
317 | } THREADNAME_INFO; | ||
318 | #pragma pack(pop) | ||
319 | #endif // !__GNUC__ | ||
320 | |||
321 | void THREAD_SETNAME( char const* _name) | ||
322 | { | ||
323 | #if !defined __GNUC__ | ||
324 | THREADNAME_INFO info; | ||
325 | info.dwType = 0x1000; | ||
326 | info.szName = _name; | ||
327 | info.dwThreadID = GetCurrentThreadId(); | ||
328 | info.dwFlags = 0; | ||
329 | |||
330 | __try | ||
331 | { | ||
332 | RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info ); | ||
333 | } | ||
334 | __except(EXCEPTION_EXECUTE_HANDLER) | ||
335 | { | ||
336 | } | ||
337 | #endif // !__GNUC__ | ||
338 | } | ||
339 | |||
340 | |||
306 | // | 341 | // |
307 | void SIGNAL_INIT( SIGNAL_T *ref ) { | 342 | void SIGNAL_INIT( SIGNAL_T *ref ) { |
308 | // 'manual reset' event type selected, to be able to wake up all the | 343 | // 'manual reset' event type selected, to be able to wake up all the |
@@ -735,6 +770,19 @@ bool_t THREAD_WAIT( THREAD_T *ref, double secs , SIGNAL_T *signal_ref, MUTEX_T * | |||
735 | void THREAD_KILL( THREAD_T *ref ) { | 770 | void THREAD_KILL( THREAD_T *ref ) { |
736 | pthread_cancel( *ref ); | 771 | pthread_cancel( *ref ); |
737 | } | 772 | } |
738 | #endif // THREADAPI == THREADAPI_PTHREAD | ||
739 | 773 | ||
740 | static const lua_Alloc alloc_f= 0; | 774 | void THREAD_SETNAME( char const* _name) |
775 | { | ||
776 | // exact API to set the thread name is platform-dependant | ||
777 | // if you need to fix the build, or if you know how to fill a hole, tell me (bnt.germain@gmail.com) so that I can submit the fix in github. | ||
778 | #if defined PLATFORM_BSD | ||
779 | pthread_set_name_np( pthread_self(), _name); | ||
780 | #elif defined PLATFORM_LINUX || defined PLATFORM_QNX || defined PLATFORM_CYGWIN | ||
781 | pthread_setname_np(_name pthread_self(), _name); | ||
782 | #elif defined PLATFORM_OSX | ||
783 | pthread_setname_np(_name); | ||
784 | #elif defined PLATFORM_WIN32 || defined PLATFORM_POCKETPC | ||
785 | // no API in win32-pthread yet :-( | ||
786 | #endif | ||
787 | } | ||
788 | #endif // THREADAPI == THREADAPI_PTHREAD | ||