Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r74237:66b144c1d6f7 Date: 2014-10-25 19:24 +0200 http://bitbucket.org/pypy/pypy/changeset/66b144c1d6f7/
Log: Test and fix on Windows: if we pass a timeout larger than 49 days, we used to get an abort in thread_nt.c. diff --git a/rpython/rlib/test/test_rthread.py b/rpython/rlib/test/test_rthread.py --- a/rpython/rlib/test/test_rthread.py +++ b/rpython/rlib/test/test_rthread.py @@ -1,5 +1,6 @@ import gc, time from rpython.rlib.rthread import * +from rpython.rlib.rarithmetic import r_longlong from rpython.translator.c.test.test_boehm import AbstractGCTestClass from rpython.rtyper.lltypesystem import lltype, rffi import py @@ -188,6 +189,15 @@ res = fn() assert res < -1.0 + def test_acquire_timed_huge_timeout(self): + t = r_longlong(2 ** 61) + def f(): + l = allocate_lock() + return l.acquire_timed(t) + fn = self.getcompiled(f, []) + res = fn() + assert res == 1 # RPY_LOCK_ACQUIRED + def test_acquire_timed_alarm(self): import sys if not sys.platform.startswith('linux'): diff --git a/rpython/translator/c/src/thread_nt.c b/rpython/translator/c/src/thread_nt.c --- a/rpython/translator/c/src/thread_nt.c +++ b/rpython/translator/c/src/thread_nt.c @@ -103,12 +103,14 @@ /************************************************************/ +static BOOL InitializeNonRecursiveMutex(PNRMUTEX mutex) { mutex->sem = CreateSemaphore(NULL, 1, 1, NULL); return !!mutex->sem; } +static VOID DeleteNonRecursiveMutex(PNRMUTEX mutex) { /* No in-use check */ @@ -116,11 +118,24 @@ mutex->sem = NULL ; /* Just in case */ } -DWORD EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) +static +DWORD EnterNonRecursiveMutex(PNRMUTEX mutex, RPY_TIMEOUT_T milliseconds) { - return WaitForSingleObject(mutex->sem, milliseconds); + DWORD res; + + if (milliseconds < 0) + return WaitForSingleObject(mutex->sem, INFINITE); + + while (milliseconds >= (RPY_TIMEOUT_T)INFINITE) { + res = WaitForSingleObject(mutex->sem, INFINITE - 1); + if (res != WAIT_TIMEOUT) + return res; + milliseconds -= (RPY_TIMEOUT_T)(INFINITE - 1); + } + return WaitForSingleObject(mutex->sem, (DWORD)milliseconds); } +static BOOL LeaveNonRecursiveMutex(PNRMUTEX mutex) { return ReleaseSemaphore(mutex->sem, 1, NULL); @@ -162,17 +177,9 @@ milliseconds = microseconds / 1000; if (microseconds % 1000 > 0) ++milliseconds; - if ((DWORD) milliseconds != milliseconds) { - fprintf(stderr, "Timeout too large for a DWORD, " - "please check RPY_TIMEOUT_MAX"); - abort(); - } } - else - milliseconds = INFINITE; - if (lock && EnterNonRecursiveMutex( - lock, (DWORD)milliseconds) == WAIT_OBJECT_0) { + if (lock && EnterNonRecursiveMutex(lock, milliseconds) == WAIT_OBJECT_0) { success = RPY_LOCK_ACQUIRED; } else { _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit