No longer call WaitFor*Object* from ntdll (but NtWait*Object*).

This commit is contained in:
Eric Pouech 2003-04-03 23:57:11 +00:00 committed by Alexandre Julliard
parent ef141f721c
commit 14d04b608c
5 changed files with 25 additions and 11 deletions

View File

@ -146,23 +146,28 @@ NTSTATUS WINAPI RtlpWaitForCriticalSection( RTL_CRITICAL_SECTION *crit )
{ {
EXCEPTION_RECORD rec; EXCEPTION_RECORD rec;
HANDLE sem = get_semaphore( crit ); HANDLE sem = get_semaphore( crit );
LARGE_INTEGER time;
DWORD status;
DWORD res = WaitForSingleObject( sem, 5000L ); time.QuadPart = -5000 * 10000; /* 5 seconds */
if ( res == WAIT_TIMEOUT ) status = NtWaitForSingleObject( sem, FALSE, &time );
if ( status == WAIT_TIMEOUT )
{ {
const char *name = (char *)crit->DebugInfo; const char *name = (char *)crit->DebugInfo;
if (!name) name = "?"; if (!name) name = "?";
ERR( "section %p %s wait timed out, retrying (60 sec) tid=%04lx\n", ERR( "section %p %s wait timed out, retrying (60 sec) tid=%04lx\n",
crit, debugstr_a(name), GetCurrentThreadId() ); crit, debugstr_a(name), GetCurrentThreadId() );
res = WaitForSingleObject( sem, 60000L ); time.QuadPart = -60000 * 10000;
if ( res == WAIT_TIMEOUT && TRACE_ON(relay) ) status = NtWaitForSingleObject( sem, FALSE, &time );
if ( status == WAIT_TIMEOUT && TRACE_ON(relay) )
{ {
ERR( "section %p %s wait timed out, retrying (5 min) tid=%04lx\n", ERR( "section %p %s wait timed out, retrying (5 min) tid=%04lx\n",
crit, debugstr_a(name), GetCurrentThreadId() ); crit, debugstr_a(name), GetCurrentThreadId() );
res = WaitForSingleObject( sem, 300000L ); time.QuadPart = -300000 * (ULONGLONG)10000;
status = NtWaitForSingleObject( sem, FALSE, &time );
} }
} }
if (res == STATUS_WAIT_0) return STATUS_SUCCESS; if (status == STATUS_WAIT_0) return STATUS_SUCCESS;
/* Throw exception only for Wine internal locks */ /* Throw exception only for Wine internal locks */
if (!crit->DebugInfo) continue; if (!crit->DebugInfo) continue;

View File

@ -166,7 +166,7 @@ wait:
rwl->uExclusiveWaiters++; rwl->uExclusiveWaiters++;
RtlLeaveCriticalSection( &rwl->rtlCS ); RtlLeaveCriticalSection( &rwl->rtlCS );
if( WaitForSingleObject( rwl->hExclusiveReleaseSemaphore, INFINITE ) == WAIT_FAILED ) if( NtWaitForSingleObject( rwl->hExclusiveReleaseSemaphore, FALSE, NULL ) == WAIT_FAILED )
goto done; goto done;
goto start; /* restart the acquisition to avoid deadlocks */ goto start; /* restart the acquisition to avoid deadlocks */
} }
@ -206,7 +206,7 @@ start:
{ {
rwl->uSharedWaiters++; rwl->uSharedWaiters++;
RtlLeaveCriticalSection( &rwl->rtlCS ); RtlLeaveCriticalSection( &rwl->rtlCS );
if( (dwWait = WaitForSingleObject( rwl->hSharedReleaseSemaphore, INFINITE )) == WAIT_FAILED ) if( (dwWait = NtWaitForSingleObject( rwl->hSharedReleaseSemaphore, FALSE, NULL )) == WAIT_FAILED )
goto done; goto done;
goto start; goto start;
} }

View File

@ -1125,9 +1125,12 @@ static HANDLER_DEF(term_handler)
*/ */
static HANDLER_DEF(usr1_handler) static HANDLER_DEF(usr1_handler)
{ {
LARGE_INTEGER timeout;
init_handler( HANDLER_CONTEXT ); init_handler( HANDLER_CONTEXT );
/* wait with 0 timeout, will only return once the thread is no longer suspended */ /* wait with 0 timeout, will only return once the thread is no longer suspended */
WaitForMultipleObjectsEx( 0, NULL, FALSE, 0, FALSE ); timeout.QuadPart = 0;
NtWaitForMultipleObjects( 0, NULL, FALSE, FALSE, &timeout );
} }

View File

@ -409,8 +409,11 @@ static HANDLER_DEF(term_handler)
*/ */
static HANDLER_DEF(usr1_handler) static HANDLER_DEF(usr1_handler)
{ {
LARGE_INTEGER timeout;
/* wait with 0 timeout, will only return once the thread is no longer suspended */ /* wait with 0 timeout, will only return once the thread is no longer suspended */
WaitForMultipleObjectsEx( 0, NULL, FALSE, 0, FALSE ); timeout.QuadPart = 0;
NtWaitForMultipleObjects( 0, NULL, FALSE, FALSE, &timeout );
} }

View File

@ -384,8 +384,11 @@ static HANDLER_DEF(term_handler)
*/ */
static HANDLER_DEF(usr1_handler) static HANDLER_DEF(usr1_handler)
{ {
LARGE_INTEGER timeout;
/* wait with 0 timeout, will only return once the thread is no longer suspended */ /* wait with 0 timeout, will only return once the thread is no longer suspended */
WaitForMultipleObjectsEx( 0, NULL, FALSE, 0, FALSE ); timeout.QuadPart = 0;
NtWaitForMultipleObjects( 0, NULL, FALSE, FALSE, &timeout );
} }