Commit 177a7e56 authored by Alexandre Julliard's avatar Alexandre Julliard

Revert "ntdll: Fix possible deadlock in vectored exception handling."

This reverts commit eb0e82a7. It's causing different deadlocks, notably when a thread tries to remove a handler inside a handler.
parent 1309731b
...@@ -48,17 +48,14 @@ typedef struct ...@@ -48,17 +48,14 @@ typedef struct
static struct list vectored_handlers = LIST_INIT(vectored_handlers); static struct list vectored_handlers = LIST_INIT(vectored_handlers);
static RTL_RWLOCK vectored_handlers_lock; static RTL_CRITICAL_SECTION vectored_handlers_section;
static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
/**********************************************************************
* exceptions_init
*
* Initialize read/write lock used by the vectored exception handling.
*/
void exceptions_init(void)
{ {
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 * wait_suspend
...@@ -165,7 +162,7 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) ...@@ -165,7 +162,7 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context )
except_ptrs.ExceptionRecord = rec; except_ptrs.ExceptionRecord = rec;
except_ptrs.ContextRecord = context; except_ptrs.ContextRecord = context;
RtlAcquireResourceShared( &vectored_handlers_lock, TRUE ); RtlEnterCriticalSection( &vectored_handlers_section );
LIST_FOR_EACH( ptr, &vectored_handlers ) LIST_FOR_EACH( ptr, &vectored_handlers )
{ {
VECTORED_HANDLER *handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry ); VECTORED_HANDLER *handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry );
...@@ -175,7 +172,7 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) ...@@ -175,7 +172,7 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context )
TRACE( "handler at %p returned %x\n", handler->func, ret ); TRACE( "handler at %p returned %x\n", handler->func, ret );
if (ret == EXCEPTION_CONTINUE_EXECUTION) break; if (ret == EXCEPTION_CONTINUE_EXECUTION) break;
} }
RtlReleaseResource( &vectored_handlers_lock ); RtlLeaveCriticalSection( &vectored_handlers_section );
return ret; return ret;
} }
...@@ -217,10 +214,10 @@ PVOID WINAPI RtlAddVectoredExceptionHandler( ULONG first, PVECTORED_EXCEPTION_HA ...@@ -217,10 +214,10 @@ PVOID WINAPI RtlAddVectoredExceptionHandler( ULONG first, PVECTORED_EXCEPTION_HA
if (handler) if (handler)
{ {
handler->func = func; handler->func = func;
RtlAcquireResourceExclusive( &vectored_handlers_lock, TRUE ); RtlEnterCriticalSection( &vectored_handlers_section );
if (first) list_add_head( &vectored_handlers, &handler->entry ); if (first) list_add_head( &vectored_handlers, &handler->entry );
else list_add_tail( &vectored_handlers, &handler->entry ); else list_add_tail( &vectored_handlers, &handler->entry );
RtlReleaseResource( &vectored_handlers_lock ); RtlLeaveCriticalSection( &vectored_handlers_section );
} }
return handler; return handler;
} }
...@@ -234,7 +231,7 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler ) ...@@ -234,7 +231,7 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler )
struct list *ptr; struct list *ptr;
ULONG ret = FALSE; ULONG ret = FALSE;
RtlAcquireResourceExclusive( &vectored_handlers_lock, TRUE ); RtlEnterCriticalSection( &vectored_handlers_section );
LIST_FOR_EACH( ptr, &vectored_handlers ) LIST_FOR_EACH( ptr, &vectored_handlers )
{ {
VECTORED_HANDLER *curr_handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry ); VECTORED_HANDLER *curr_handler = LIST_ENTRY( ptr, VECTORED_HANDLER, entry );
...@@ -245,7 +242,7 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler ) ...@@ -245,7 +242,7 @@ ULONG WINAPI RtlRemoveVectoredExceptionHandler( PVOID handler )
break; break;
} }
} }
RtlReleaseResource( &vectored_handlers_lock ); RtlLeaveCriticalSection( &vectored_handlers_section );
if (ret) RtlFreeHeap( GetProcessHeap(), 0, handler ); if (ret) RtlFreeHeap( GetProcessHeap(), 0, handler );
return ret; return ret;
} }
......
...@@ -71,7 +71,6 @@ extern void virtual_init(void); ...@@ -71,7 +71,6 @@ extern void virtual_init(void);
extern void virtual_init_threading(void); extern void virtual_init_threading(void);
extern void fill_cpu_info(void); extern void fill_cpu_info(void);
extern void heap_set_debug_flags( HANDLE handle ); extern void heap_set_debug_flags( HANDLE handle );
extern void exceptions_init(void);
/* server support */ /* server support */
extern timeout_t server_start_time; extern timeout_t server_start_time;
......
...@@ -296,7 +296,6 @@ HANDLE thread_init(void) ...@@ -296,7 +296,6 @@ HANDLE thread_init(void)
user_shared_data->TickCountMultiplier = 1 << 24; user_shared_data->TickCountMultiplier = 1 << 24;
fill_cpu_info(); fill_cpu_info();
exceptions_init();
return exe_file; return exe_file;
} }
......
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