Commit 6f1b6424 authored by Alexandre Julliard's avatar Alexandre Julliard

Raise an exception when a critical section wait failed.

parent 4d715fd9
...@@ -693,6 +693,9 @@ DWORD wine_debugger( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance ...@@ -693,6 +693,9 @@ DWORD wine_debugger( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance
case CONTROL_C_EXIT: case CONTROL_C_EXIT:
fprintf( stderr, "^C" ); fprintf( stderr, "^C" );
break; break;
case EXCEPTION_CRITICAL_SECTION_WAIT:
fprintf( stderr, "critical section %08lx wait failed", rec->ExceptionInformation[0] );
break;
default: default:
fprintf( stderr, "%08lx", rec->ExceptionCode ); fprintf( stderr, "%08lx", rec->ExceptionCode );
break; break;
......
...@@ -973,6 +973,8 @@ typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER, LARGE_INTEGER, LARGE_I ...@@ -973,6 +973,8 @@ typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER, LARGE_INTEGER, LARGE_I
#define EXCEPTION_INVALID_HANDLE STATUS_INVALID_HANDLE #define EXCEPTION_INVALID_HANDLE STATUS_INVALID_HANDLE
#define CONTROL_C_EXIT STATUS_CONTROL_C_EXIT #define CONTROL_C_EXIT STATUS_CONTROL_C_EXIT
/* Wine extension; Windows doesn't have a name for this code */
#define EXCEPTION_CRITICAL_SECTION_WAIT 0xc0000194
#define DUPLICATE_CLOSE_SOURCE 0x00000001 #define DUPLICATE_CLOSE_SOURCE 0x00000001
#define DUPLICATE_SAME_ACCESS 0x00000002 #define DUPLICATE_SAME_ACCESS 0x00000002
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <sys/types.h> #include <sys/types.h>
#include "winerror.h" #include "winerror.h"
#include "winbase.h" #include "winbase.h"
#include "ntddk.h"
#include "heap.h" #include "heap.h"
#include "debugtools.h" #include "debugtools.h"
#include "thread.h" #include "thread.h"
...@@ -78,21 +79,30 @@ void WINAPI EnterCriticalSection( CRITICAL_SECTION *crit ) ...@@ -78,21 +79,30 @@ void WINAPI EnterCriticalSection( CRITICAL_SECTION *crit )
} }
/* Now wait for it */ /* Now wait for it */
res = WaitForSingleObject( crit->LockSemaphore, 5000L ); for (;;)
if ( res == WAIT_TIMEOUT )
{ {
ERR_(win32)("Critical section %p wait timed out, retrying (60 sec)\n", crit ); EXCEPTION_RECORD rec;
res = WaitForSingleObject( crit->LockSemaphore, 60000L );
} res = WaitForSingleObject( crit->LockSemaphore, 5000L );
if ( res == WAIT_TIMEOUT && TRACE_ON(relay) ) if ( res == WAIT_TIMEOUT )
{ {
ERR_(win32)("Critical section %p wait timed out, retrying (5 min)\n", crit ); ERR_(win32)("Critical section %p wait timed out, retrying (60 sec)\n", crit );
res = WaitForSingleObject( crit->LockSemaphore, 300000L ); res = WaitForSingleObject( crit->LockSemaphore, 60000L );
} if ( res == WAIT_TIMEOUT && TRACE_ON(relay) )
if (res != STATUS_WAIT_0) {
{ ERR_(win32)("Critical section %p wait timed out, retrying (5 min)\n", crit );
ERR_(win32)("Critical section %p wait failed err=%lx\n", crit, res ); res = WaitForSingleObject( crit->LockSemaphore, 300000L );
/* FIXME: should raise an exception */ }
}
if (res == STATUS_WAIT_0) break;
rec.ExceptionCode = EXCEPTION_CRITICAL_SECTION_WAIT;
rec.ExceptionFlags = 0;
rec.ExceptionRecord = NULL;
rec.ExceptionAddress = RtlRaiseException; /* sic */
rec.NumberParameters = 1;
rec.ExceptionInformation[0] = (DWORD)crit;
RtlRaiseException( &rec );
} }
} }
crit->OwningThread = GetCurrentThreadId(); crit->OwningThread = GetCurrentThreadId();
......
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