From 51388af06fc6a6fbd9ee78a762aa2b15924d00cb Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 31 May 2023 22:17:52 +0200 Subject: [PATCH] msvcr100: Use Context to store critical_section owner. --- dlls/msvcp140/tests/msvcp140.c | 2 +- dlls/msvcp90/msvcp90.h | 2 +- dlls/msvcr120/tests/msvcr120.c | 2 +- dlls/msvcrt/concurrency.c | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dlls/msvcp140/tests/msvcp140.c b/dlls/msvcp140/tests/msvcp140.c index 640e44e5b7c..6affa2f9c29 100644 --- a/dlls/msvcp140/tests/msvcp140.c +++ b/dlls/msvcp140/tests/msvcp140.c @@ -150,6 +150,7 @@ typedef struct typedef struct cs_queue { + void *ctx; struct cs_queue *next; BOOL free; int unknown; @@ -157,7 +158,6 @@ typedef struct cs_queue typedef struct { - ULONG_PTR unk_thread_id; cs_queue unk_active; void *unknown[2]; cs_queue *head; diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h index b996ae84a46..cfeb03fa235 100644 --- a/dlls/msvcp90/msvcp90.h +++ b/dlls/msvcp90/msvcp90.h @@ -45,6 +45,7 @@ extern void* (__cdecl *MSVCRT_set_new_handler)(void*); /* keep in sync with msvcrt/lock.c */ typedef struct cs_queue { + void *ctx; struct cs_queue *next; BOOL free; int unknown; @@ -52,7 +53,6 @@ typedef struct cs_queue typedef struct { - ULONG_PTR unk_thread_id; cs_queue unk_active; void *unknown[2]; cs_queue *head; diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index fd8e42fd35d..e5a5ff0435d 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -90,6 +90,7 @@ typedef unsigned char MSVCRT_bool; typedef struct cs_queue { + void *ctx; struct cs_queue *next; BOOL free; int unknown; @@ -97,7 +98,6 @@ typedef struct cs_queue typedef struct { - ULONG_PTR unk_thread_id; cs_queue unk_active; void *unknown[2]; cs_queue *head; diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index 84ee0f1817a..598444f3a53 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -216,6 +216,7 @@ struct scheduled_chore { /* keep in sync with msvcp90/msvcp90.h */ typedef struct cs_queue { + Context *ctx; struct cs_queue *next; #if _MSVCR_VER >= 110 LONG free; @@ -225,7 +226,6 @@ typedef struct cs_queue typedef struct { - ULONG_PTR unk_thread_id; cs_queue unk_active; #if _MSVCR_VER >= 110 void *unknown[2]; @@ -2425,7 +2425,7 @@ critical_section* __thiscall critical_section_ctor(critical_section *this) NtClose(event); } - this->unk_thread_id = 0; + this->unk_active.ctx = NULL; this->head = this->tail = NULL; return this; } @@ -2458,7 +2458,7 @@ static inline void spin_wait_for_next_cs(cs_queue *q) static inline void cs_set_head(critical_section *cs, cs_queue *q) { - cs->unk_thread_id = GetCurrentThreadId(); + cs->unk_active.ctx = get_current_context(); cs->unk_active.next = q->next; cs->head = &cs->unk_active; } @@ -2467,7 +2467,7 @@ static inline void cs_lock(critical_section *cs, cs_queue *q) { cs_queue *last; - if(cs->unk_thread_id == GetCurrentThreadId()) { + if(cs->unk_active.ctx == get_current_context()) { improper_lock e; improper_lock_ctor_str(&e, "Already locked"); _CxxThrowException(&e, &improper_lock_exception_type); @@ -2507,7 +2507,7 @@ bool __thiscall critical_section_try_lock(critical_section *this) TRACE("(%p)\n", this); - if(this->unk_thread_id == GetCurrentThreadId()) + if(this->unk_active.ctx == get_current_context()) return FALSE; memset(&q, 0, sizeof(q)); @@ -2529,7 +2529,7 @@ void __thiscall critical_section_unlock(critical_section *this) { TRACE("(%p)\n", this); - this->unk_thread_id = 0; + this->unk_active.ctx = NULL; this->head = NULL; if(InterlockedCompareExchangePointer(&this->tail, NULL, &this->unk_active) == &this->unk_active) return; @@ -2577,7 +2577,7 @@ bool __thiscall critical_section_try_lock_for( TRACE("(%p %d)\n", this, timeout); - if(this->unk_thread_id == GetCurrentThreadId()) { + if(this->unk_active.ctx == get_current_context()) { improper_lock e; improper_lock_ctor_str(&e, "Already locked"); _CxxThrowException(&e, &improper_lock_exception_type);