Module: wine Branch: master Commit: 88f7fd5deacf3c36890aa96e3515fda3c531be03 URL: http://source.winehq.org/git/wine.git/?a=commit;h=88f7fd5deacf3c36890aa96e35...
Author: Jacek Caban jacek@codeweavers.com Date: Sun May 24 23:17:03 2009 +0200
mshtml: Use TLS_OUT_OF_INDEXES as invalid TLS value.
Spotted by Vitaliy Margolen.
---
dlls/mshtml/main.c | 4 ++-- dlls/mshtml/task.c | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c index aed4d76..3057276 100644 --- a/dlls/mshtml/main.c +++ b/dlls/mshtml/main.c @@ -44,7 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
HINSTANCE hInst; -DWORD mshtml_tls = 0; +DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
static HINSTANCE shdoclc = NULL;
@@ -69,7 +69,7 @@ static void process_detach(void)
if(shdoclc) FreeLibrary(shdoclc); - if(mshtml_tls) + if(mshtml_tls != TLS_OUT_OF_INDEXES) TlsFree(mshtml_tls); }
diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c index ffef543..496b96f 100644 --- a/dlls/mshtml/task.c +++ b/dlls/mshtml/task.c @@ -478,11 +478,19 @@ thread_data_t *get_thread_data(BOOL create) { thread_data_t *thread_data;
- if(!mshtml_tls) { - if(create) - mshtml_tls = TlsAlloc(); - else + if(mshtml_tls == TLS_OUT_OF_INDEXES) { + DWORD tls; + + if(!create) + return NULL; + + tls = TlsAlloc(); + if(tls == TLS_OUT_OF_INDEXES) return NULL; + + tls = InterlockedCompareExchange((LONG*)&mshtml_tls, tls, TLS_OUT_OF_INDEXES); + if(tls != mshtml_tls) + TlsFree(tls); }
thread_data = TlsGetValue(mshtml_tls);