summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristján Valur Jónsson <sweskman@gmail.com>2014-05-08 10:36:27 (GMT)
committerKristján Valur Jónsson <sweskman@gmail.com>2014-05-08 10:36:27 (GMT)
commitddf343855d787520d1ac72c7dcfdeb91e72731da (patch)
tree91edb07e67ac96d80390f9c7b9137e74df50c95f
parent8577e5ae090dcd63447807e77c1dadc8be9602b9 (diff)
downloadcpython-ddf343855d787520d1ac72c7dcfdeb91e72731da.zip
cpython-ddf343855d787520d1ac72c7dcfdeb91e72731da.tar.gz
cpython-ddf343855d787520d1ac72c7dcfdeb91e72731da.tar.bz2
The PyCOND_TIMEDWAIT must use microseconds for the timeout argument
in order to have the same resolution as pthreads condition variables. At the same time, it must be large enough to accept 31 bits of milliseconds, which is the maximum timeout value in the windows API. A PY_LONG_LONG of microseconds fullfills both requirements. This closes issue #20737
-rw-r--r--Python/condvar.h12
-rw-r--r--Python/thread_nt.h2
2 files changed, 7 insertions, 7 deletions
diff --git a/Python/condvar.h b/Python/condvar.h
index bbb40ba..19474ef 100644
--- a/Python/condvar.h
+++ b/Python/condvar.h
@@ -60,7 +60,7 @@
#include <pthread.h>
#define PyCOND_ADD_MICROSECONDS(tv, interval) \
-do { \
+do { /* TODO: add overflow and truncation checks */ \
tv.tv_usec += (long) interval; \
tv.tv_sec += tv.tv_usec / 1000000; \
tv.tv_usec %= 1000000; \
@@ -89,7 +89,7 @@ do { \
/* return 0 for success, 1 on timeout, -1 on error */
Py_LOCAL_INLINE(int)
-PyCOND_TIMEDWAIT(PyCOND_T *cond, PyMUTEX_T *mut, long us)
+PyCOND_TIMEDWAIT(PyCOND_T *cond, PyMUTEX_T *mut, PY_LONG_LONG us)
{
int r;
struct timespec ts;
@@ -270,9 +270,9 @@ PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
}
Py_LOCAL_INLINE(int)
-PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us)
+PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, PY_LONG_LONG us)
{
- return _PyCOND_WAIT_MS(cv, cs, us/1000);
+ return _PyCOND_WAIT_MS(cv, cs, (DWORD)(us/1000));
}
Py_LOCAL_INLINE(int)
@@ -363,9 +363,9 @@ PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
* 2 to indicate that we don't know.
*/
Py_LOCAL_INLINE(int)
-PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us)
+PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, PY_LONG_LONG us)
{
- return SleepConditionVariableSRW(cv, cs, us/1000, 0) ? 2 : -1;
+ return SleepConditionVariableSRW(cv, cs, (DWORD)(us/1000), 0) ? 2 : -1;
}
Py_LOCAL_INLINE(int)
diff --git a/Python/thread_nt.h b/Python/thread_nt.h
index 938bf1e..b157fc5 100644
--- a/Python/thread_nt.h
+++ b/Python/thread_nt.h
@@ -77,7 +77,7 @@ EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds)
/* wait at least until the target */
DWORD now, target = GetTickCount() + milliseconds;
while (mutex->locked) {
- if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, milliseconds*1000) < 0) {
+ if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, (PY_LONG_LONG)milliseconds*1000) < 0) {
result = WAIT_FAILED;
break;
}