diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 4d2f759c5e1..63fd281b4b5 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -48,17 +48,14 @@ typedef struct static struct list vectored_handlers = LIST_INIT(vectored_handlers); -static RTL_RWLOCK vectored_handlers_lock; - -/********************************************************************** - * exceptions_init - * - * Initialize read/write lock used by the vectored exception handling. - */ -void exceptions_init(void) +static RTL_CRITICAL_SECTION vectored_handlers_section; +static RTL_CRITICAL_SECTION_DEBUG critsect_debug = { - RtlInitializeResource(&vectored_handlers_lock); -} + 0, 0, &vectored_handlers_section, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": vectored_handlers_section") } +}; +static RTL_CRITICAL_SECTION vectored_handlers_section = { &critsect_debug, -1, 0, 0, 0, 0 }; /********************************************************************** * wait_suspend @@ -165,7 +162,7 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) except_ptrs.ExceptionRecord = rec; except_ptrs.ContextRecord = context; - RtlAcquireResourceShared( &vectored_handlers_lock, TRUE ); + RtlEnterCriticalSection( &vectored_handlers_section ); LIST_FOR_EACH( ptr, &vectored_handlers ) { VECTORED_HANDLER *handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry ); @@ -175,7 +172,7 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) TRACE( "handler at %p returned %x\n", handler->func, ret ); if (ret == EXCEPTION_CONTINUE_EXECUTION) break; } - RtlReleaseResource( &vectored_handlers_lock ); + RtlLeaveCriticalSection( &vectored_handlers_section ); return ret; } @@ -217,10 +214,10 @@ PVOID WINAPI RtlAddVectoredExceptionHandler( ULONG first, PVECTORED_EXCEPTION_HA if (handler) { handler->func = func; - RtlAcquireResourceExclusive( &vectored_handlers_lock, TRUE ); + RtlEnterCriticalSection( &vectored_handlers_section ); if (first) list_add_head( &vectored_handlers, &handler->entry ); else list_add_tail( &vectored_handlers, &handler->entry ); - RtlReleaseResource( &vectored_handlers_lock ); + RtlLeaveCriticalSection( &vectored_handlers_section ); } return handler; } @@ -234,7 +231,7 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler ) struct list *ptr; ULONG ret = FALSE; - RtlAcquireResourceExclusive( &vectored_handlers_lock, TRUE ); + RtlEnterCriticalSection( &vectored_handlers_section ); LIST_FOR_EACH( ptr, &vectored_handlers ) { VECTORED_HANDLER *curr_handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry ); @@ -245,7 +242,7 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler ) break; } } - RtlReleaseResource( &vectored_handlers_lock ); + RtlLeaveCriticalSection( &vectored_handlers_section ); if (ret) RtlFreeHeap( GetProcessHeap(), 0, handler ); return ret; } diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 3c35251977d..212edf5b30e 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -71,7 +71,6 @@ extern void virtual_init(void); extern void virtual_init_threading(void); extern void fill_cpu_info(void); extern void heap_set_debug_flags( HANDLE handle ); -extern void exceptions_init(void); /* server support */ extern timeout_t server_start_time; diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index fb6b2d20c38..56eca23c8af 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -296,7 +296,6 @@ HANDLE thread_init(void) user_shared_data->TickCountMultiplier = 1 << 24; fill_cpu_info(); - exceptions_init(); return exe_file; }