Commit 51388af0 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcr100: Use Context to store critical_section owner.

parent 6e238142
...@@ -150,6 +150,7 @@ typedef struct ...@@ -150,6 +150,7 @@ typedef struct
typedef struct cs_queue typedef struct cs_queue
{ {
void *ctx;
struct cs_queue *next; struct cs_queue *next;
BOOL free; BOOL free;
int unknown; int unknown;
...@@ -157,7 +158,6 @@ typedef struct cs_queue ...@@ -157,7 +158,6 @@ typedef struct cs_queue
typedef struct typedef struct
{ {
ULONG_PTR unk_thread_id;
cs_queue unk_active; cs_queue unk_active;
void *unknown[2]; void *unknown[2];
cs_queue *head; cs_queue *head;
......
...@@ -45,6 +45,7 @@ extern void* (__cdecl *MSVCRT_set_new_handler)(void*); ...@@ -45,6 +45,7 @@ extern void* (__cdecl *MSVCRT_set_new_handler)(void*);
/* keep in sync with msvcrt/lock.c */ /* keep in sync with msvcrt/lock.c */
typedef struct cs_queue typedef struct cs_queue
{ {
void *ctx;
struct cs_queue *next; struct cs_queue *next;
BOOL free; BOOL free;
int unknown; int unknown;
...@@ -52,7 +53,6 @@ typedef struct cs_queue ...@@ -52,7 +53,6 @@ typedef struct cs_queue
typedef struct typedef struct
{ {
ULONG_PTR unk_thread_id;
cs_queue unk_active; cs_queue unk_active;
void *unknown[2]; void *unknown[2];
cs_queue *head; cs_queue *head;
......
...@@ -90,6 +90,7 @@ typedef unsigned char MSVCRT_bool; ...@@ -90,6 +90,7 @@ typedef unsigned char MSVCRT_bool;
typedef struct cs_queue typedef struct cs_queue
{ {
void *ctx;
struct cs_queue *next; struct cs_queue *next;
BOOL free; BOOL free;
int unknown; int unknown;
...@@ -97,7 +98,6 @@ typedef struct cs_queue ...@@ -97,7 +98,6 @@ typedef struct cs_queue
typedef struct typedef struct
{ {
ULONG_PTR unk_thread_id;
cs_queue unk_active; cs_queue unk_active;
void *unknown[2]; void *unknown[2];
cs_queue *head; cs_queue *head;
......
...@@ -216,6 +216,7 @@ struct scheduled_chore { ...@@ -216,6 +216,7 @@ struct scheduled_chore {
/* keep in sync with msvcp90/msvcp90.h */ /* keep in sync with msvcp90/msvcp90.h */
typedef struct cs_queue typedef struct cs_queue
{ {
Context *ctx;
struct cs_queue *next; struct cs_queue *next;
#if _MSVCR_VER >= 110 #if _MSVCR_VER >= 110
LONG free; LONG free;
...@@ -225,7 +226,6 @@ typedef struct cs_queue ...@@ -225,7 +226,6 @@ typedef struct cs_queue
typedef struct typedef struct
{ {
ULONG_PTR unk_thread_id;
cs_queue unk_active; cs_queue unk_active;
#if _MSVCR_VER >= 110 #if _MSVCR_VER >= 110
void *unknown[2]; void *unknown[2];
...@@ -2425,7 +2425,7 @@ critical_section* __thiscall critical_section_ctor(critical_section *this) ...@@ -2425,7 +2425,7 @@ critical_section* __thiscall critical_section_ctor(critical_section *this)
NtClose(event); NtClose(event);
} }
this->unk_thread_id = 0; this->unk_active.ctx = NULL;
this->head = this->tail = NULL; this->head = this->tail = NULL;
return this; return this;
} }
...@@ -2458,7 +2458,7 @@ static inline void spin_wait_for_next_cs(cs_queue *q) ...@@ -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) 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->unk_active.next = q->next;
cs->head = &cs->unk_active; cs->head = &cs->unk_active;
} }
...@@ -2467,7 +2467,7 @@ static inline void cs_lock(critical_section *cs, cs_queue *q) ...@@ -2467,7 +2467,7 @@ static inline void cs_lock(critical_section *cs, cs_queue *q)
{ {
cs_queue *last; cs_queue *last;
if(cs->unk_thread_id == GetCurrentThreadId()) { if(cs->unk_active.ctx == get_current_context()) {
improper_lock e; improper_lock e;
improper_lock_ctor_str(&e, "Already locked"); improper_lock_ctor_str(&e, "Already locked");
_CxxThrowException(&e, &improper_lock_exception_type); _CxxThrowException(&e, &improper_lock_exception_type);
...@@ -2507,7 +2507,7 @@ bool __thiscall critical_section_try_lock(critical_section *this) ...@@ -2507,7 +2507,7 @@ bool __thiscall critical_section_try_lock(critical_section *this)
TRACE("(%p)\n", this); TRACE("(%p)\n", this);
if(this->unk_thread_id == GetCurrentThreadId()) if(this->unk_active.ctx == get_current_context())
return FALSE; return FALSE;
memset(&q, 0, sizeof(q)); memset(&q, 0, sizeof(q));
...@@ -2529,7 +2529,7 @@ void __thiscall critical_section_unlock(critical_section *this) ...@@ -2529,7 +2529,7 @@ void __thiscall critical_section_unlock(critical_section *this)
{ {
TRACE("(%p)\n", this); TRACE("(%p)\n", this);
this->unk_thread_id = 0; this->unk_active.ctx = NULL;
this->head = NULL; this->head = NULL;
if(InterlockedCompareExchangePointer(&this->tail, NULL, &this->unk_active) if(InterlockedCompareExchangePointer(&this->tail, NULL, &this->unk_active)
== &this->unk_active) return; == &this->unk_active) return;
...@@ -2577,7 +2577,7 @@ bool __thiscall critical_section_try_lock_for( ...@@ -2577,7 +2577,7 @@ bool __thiscall critical_section_try_lock_for(
TRACE("(%p %d)\n", this, timeout); 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 e;
improper_lock_ctor_str(&e, "Already locked"); improper_lock_ctor_str(&e, "Already locked");
_CxxThrowException(&e, &improper_lock_exception_type); _CxxThrowException(&e, &improper_lock_exception_type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment