aboutsummaryrefslogtreecommitdiff
path: root/src/threading.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/threading.c')
-rw-r--r--src/threading.c52
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
740static 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