Alexandre Julliard : Revert "ntdll: Fix possible deadlock in vectored exception handling."
Alexandre Julliard
julliard at winehq.org
Thu Nov 11 12:05:47 CST 2010
Module: wine
Branch: master
Commit: 177a7e5683c5dc85cffe7ce46176743427f8398d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=177a7e5683c5dc85cffe7ce46176743427f8398d
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Nov 10 19:17:41 2010 +0100
Revert "ntdll: Fix possible deadlock in vectored exception handling."
This reverts commit eb0e82a75568db095df5f78be703987147f00f66.
It's causing different deadlocks, notably when a thread tries to
remove a handler inside a handler.
---
dlls/ntdll/exception.c | 29 +++++++++++++----------------
dlls/ntdll/ntdll_misc.h | 1 -
dlls/ntdll/thread.c | 1 -
3 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c
index 4d2f759..63fd281 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 3c35251..212edf5 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 fb6b2d2..56eca23 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;
}
More information about the wine-cvs
mailing list