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

Reply via email to