[Python-checkins] r76135 - in sandbox/trunk/newgil: Include/ceval.h Python/ceval_gil.h Python/sysmodule.c
antoine.pitrou
python-checkins at python.org
Fri Nov 6 21:00:13 CET 2009
Author: antoine.pitrou
Date: Fri Nov 6 21:00:13 2009
New Revision: 76135
Log:
Store the interval as microseconds. The Python API still uses seconds though.
Modified:
sandbox/trunk/newgil/Include/ceval.h
sandbox/trunk/newgil/Python/ceval_gil.h
sandbox/trunk/newgil/Python/sysmodule.c
Modified: sandbox/trunk/newgil/Include/ceval.h
==============================================================================
--- sandbox/trunk/newgil/Include/ceval.h (original)
+++ sandbox/trunk/newgil/Include/ceval.h Fri Nov 6 21:00:13 2009
@@ -171,8 +171,8 @@
PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate);
PyAPI_FUNC(void) PyEval_ReInitThreads(void);
-PyAPI_FUNC(void) _PyEval_SetSwitchInterval(double seconds);
-PyAPI_FUNC(double) _PyEval_GetSwitchInterval(void);
+PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds);
+PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void);
#define Py_BEGIN_ALLOW_THREADS { \
PyThreadState *_save; \
Modified: sandbox/trunk/newgil/Python/ceval_gil.h
==============================================================================
--- sandbox/trunk/newgil/Python/ceval_gil.h (original)
+++ sandbox/trunk/newgil/Python/ceval_gil.h Fri Nov 6 21:00:13 2009
@@ -8,10 +8,10 @@
/* First some general settings */
-/* milliseconds (the public API uses seconds, though) */
-#define DEFAULT_INTERVAL 5
-static double gil_interval = DEFAULT_INTERVAL;
-#define INTERVAL (gil_interval >= 1.0 ? gil_interval : 1.0)
+/* microseconds (the Python API uses seconds, though) */
+#define DEFAULT_INTERVAL 5000
+static unsigned long gil_interval = DEFAULT_INTERVAL;
+#define INTERVAL (gil_interval >= 1 ? gil_interval : 1)
/* Enable if you want to force the switching of threads at least every `gil_interval` */
#undef FORCE_SWITCHING
@@ -77,9 +77,9 @@
#include <pthread.h>
-#define ADD_MILLISECONDS(tv, interval) \
+#define ADD_MICROSECONDS(tv, interval) \
do { \
- tv.tv_usec += (long) interval * 1000; \
+ tv.tv_usec += (long) interval; \
tv.tv_sec += tv.tv_usec / 1000000; \
tv.tv_usec %= 1000000; \
} while (0)
@@ -113,14 +113,14 @@
#define COND_WAIT(cond, mut) \
if (pthread_cond_wait(&cond, &mut)) { \
Py_FatalError("pthread_cond_wait(" #cond ") failed"); };
-#define COND_TIMED_WAIT(cond, mut, milliseconds, timeout_result) \
+#define COND_TIMED_WAIT(cond, mut, microseconds, timeout_result) \
{ \
int r; \
struct timespec ts; \
struct timeval deadline; \
\
GETTIMEOFDAY(&deadline); \
- ADD_MILLISECONDS(deadline, milliseconds); \
+ ADD_MICROSECONDS(deadline, microseconds); \
ts.tv_sec = deadline.tv_sec; \
ts.tv_nsec = deadline.tv_usec * 1000; \
\
@@ -175,12 +175,12 @@
if (r != WAIT_OBJECT_0) \
Py_FatalError("WaitForSingleObject(" #cond ") failed"); \
}
-#define COND_TIMED_WAIT(cond, mut, milliseconds, timeout_result) \
+#define COND_TIMED_WAIT(cond, mut, microseconds, timeout_result) \
{ \
DWORD r; \
HANDLE objects[2] = { cond, mut }; \
MUTEX_UNLOCK(mut); \
- r = WaitForMultipleObjects(2, objects, TRUE, milliseconds); \
+ r = WaitForMultipleObjects(2, objects, TRUE, microseconds / 1000); \
if (r == WAIT_TIMEOUT) { \
MUTEX_LOCK(mut); \
timeout_result = 1; \
@@ -404,14 +404,12 @@
#endif
}
-void _PyEval_SetSwitchInterval(double seconds)
+void _PyEval_SetSwitchInterval(unsigned long microseconds)
{
- if (seconds <= 0)
- Py_FatalError("switch interval must be strictly positive");
- gil_interval = seconds * 1000.0;
+ gil_interval = microseconds;
}
-double _PyEval_GetSwitchInterval()
+unsigned long _PyEval_GetSwitchInterval()
{
- return gil_interval / 1000.0;
+ return gil_interval;
}
Modified: sandbox/trunk/newgil/Python/sysmodule.c
==============================================================================
--- sandbox/trunk/newgil/Python/sysmodule.c (original)
+++ sandbox/trunk/newgil/Python/sysmodule.c Fri Nov 6 21:00:13 2009
@@ -489,7 +489,7 @@
"switch interval must be strictly positive");
return NULL;
}
- _PyEval_SetSwitchInterval(d);
+ _PyEval_SetSwitchInterval((unsigned long) (1e6 * d));
Py_INCREF(Py_None);
return Py_None;
}
@@ -509,7 +509,7 @@
static PyObject *
sys_getswitchinterval(PyObject *self, PyObject *args)
{
- return PyFloat_FromDouble(_PyEval_GetSwitchInterval());
+ return PyFloat_FromDouble(1e-6 * _PyEval_GetSwitchInterval());
}
PyDoc_STRVAR(getswitchinterval_doc,
More information about the Python-checkins
mailing list