Module: wine Branch: master Commit: 3fbfddbd534709f9e0185d608f954390baf4f45c URL: https://source.winehq.org/git/wine.git/?a=commit;h=3fbfddbd534709f9e0185d608...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Feb 2 19:48:19 2022 +0100
msvcrt: Use InitOnceExecuteOnce to allocate TLS index.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/concurrency.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index e9047ab41b9..f0a97f98e41 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -345,7 +345,7 @@ enum ConcRT_EventType CONCRT_EVENT_DETACH };
-static int context_tls_index = TLS_OUT_OF_INDEXES; +static DWORD context_tls_index = TLS_OUT_OF_INDEXES;
static CRITICAL_SECTION default_scheduler_cs; static CRITICAL_SECTION_DEBUG default_scheduler_cs_debug = @@ -620,21 +620,23 @@ static Context* try_get_current_context(void) return TlsGetValue(context_tls_index); }
+static BOOL WINAPI init_context_tls_index(INIT_ONCE *once, void *param, void **context) +{ + context_tls_index = TlsAlloc(); + return context_tls_index != TLS_OUT_OF_INDEXES; +} + static Context* get_current_context(void) { + static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT; Context *ret;
- if (context_tls_index == TLS_OUT_OF_INDEXES) { - int tls_index = TlsAlloc(); - if (tls_index == TLS_OUT_OF_INDEXES) { - scheduler_resource_allocation_error e; - scheduler_resource_allocation_error_ctor_name(&e, NULL, - HRESULT_FROM_WIN32(GetLastError())); - _CxxThrowException(&e, &scheduler_resource_allocation_error_exception_type); - } - - if(InterlockedCompareExchange(&context_tls_index, tls_index, TLS_OUT_OF_INDEXES) != TLS_OUT_OF_INDEXES) - TlsFree(tls_index); + if(!InitOnceExecuteOnce(&init_once, init_context_tls_index, NULL, NULL)) + { + scheduler_resource_allocation_error e; + scheduler_resource_allocation_error_ctor_name(&e, NULL, + HRESULT_FROM_WIN32(GetLastError())); + _CxxThrowException(&e, &scheduler_resource_allocation_error_exception_type); }
ret = TlsGetValue(context_tls_index);