Revert "ntdll: Fix possible deadlock in vectored exception handling."
This reverts commit eb0e82a755
.
It's causing different deadlocks, notably when a thread tries to
remove a handler inside a handler.
This commit is contained in:
parent
1309731b4a
commit
177a7e5683
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -296,7 +296,6 @@ HANDLE thread_init(void)
|
|||
user_shared_data->TickCountMultiplier = 1 << 24;
|
||||
|
||||
fill_cpu_info();
|
||||
exceptions_init();
|
||||
|
||||
return exe_file;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue