msvcrt: Use InitOnceExecuteOnce to allocate TLS index.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2022-02-02 19:48:19 +01:00 committed by Alexandre Julliard
parent 2a74dc51f2
commit 3fbfddbd53
1 changed files with 14 additions and 12 deletions

View File

@ -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);