X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fwin32thread.h;h=6f355f09ebba7d21f72ede2548d1ad350d73bbb6;hb=c69f112c145fabe210a7e2c5c2406baeea71af2f;hp=0c6bb55b69f3ca440619da5eff8ac3e150fe366f;hpb=235db74f0c7445cd9b5ee77346db17e180d32b93;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/win32thread.h b/win32/win32thread.h index 0c6bb55..6f355f0 100644 --- a/win32/win32thread.h +++ b/win32/win32thread.h @@ -2,7 +2,7 @@ #define _WIN32THREAD_H typedef struct win32_cond { LONG waiters; HANDLE sem; } perl_cond; typedef DWORD perl_key; -typedef HANDLE perl_thread; +typedef HANDLE perl_os_thread; #ifndef DONT_USE_CRITICAL_SECTION @@ -97,7 +97,7 @@ typedef HANDLE perl_mutex; } \ } STMT_END -#define THR ((struct thread *) TlsGetValue(thr_key)) + #define THREAD_CREATE(t, f) Perl_thread_create(t, f) #define THREAD_POST_CREATE(t) NOOP #define THREAD_RET_TYPE DWORD WINAPI @@ -105,10 +105,25 @@ typedef HANDLE perl_mutex; typedef THREAD_RET_TYPE thread_func_t(void *); + START_EXTERN_C + +#if defined(PERLDLL) && defined(USE_DECLSPEC_THREAD) && (!defined(__BORLANDC__) || defined(_DLL)) +extern __declspec(thread) struct perl_thread *Perl_current_thread; +#define SET_THR(t) (Perl_current_thread = t) +#define THR Perl_current_thread +#else +#define THR Perl_getTHR() +#define SET_THR(t) Perl_setTHR(t) +#endif +struct perl_thread; + void Perl_alloc_thread_key _((void)); -int Perl_thread_create _((struct thread *thr, thread_func_t *fn)); -void Perl_set_thread_self _((struct thread *thr)); +int Perl_thread_create _((struct perl_thread *thr, thread_func_t *fn)); +void Perl_set_thread_self _((struct perl_thread *thr)); +struct perl_thread *Perl_getTHR _((void)); +void Perl_setTHR _((struct perl_thread *t)); + END_EXTERN_C #define INIT_THREADS NOOP @@ -122,12 +137,7 @@ END_EXTERN_C croak("panic: JOIN"); \ } STMT_END -#define SET_THR(t) \ - STMT_START { \ - if (TlsSetValue(thr_key, (void *) (t)) == 0) \ - croak("panic: TlsSetValue"); \ - } STMT_END - #define YIELD Sleep(0) #endif /* _WIN32THREAD_H */ +