]> granicus.if.org Git - python/commitdiff
Win32 precision clock() -- Mark Hammond.
authorGuido van Rossum <guido@python.org>
Wed, 2 Apr 1997 05:35:28 +0000 (05:35 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 2 Apr 1997 05:35:28 +0000 (05:35 +0000)
Modules/timemodule.c

index 1f5593366b306d4638bed87bb3c516dac0190339..9a8fb8b5b55cc492e5433cd7062c3293ee78cc21 100644 (file)
@@ -79,6 +79,12 @@ extern int ftime();
 #endif /* MS_WINDOWS */
 #endif /* !__WATCOMC__ */
 
+#ifdef MS_WIN32
+/* Win32 has better clock replacement */
+#include <largeint.h>
+#undef HAVE_CLOCK /* We have our own version down below */
+#endif /* MS_WIN32 */
+
 /* Forward declarations */
 static int floatsleep Py_PROTO((double));
 static double floattime Py_PROTO(());
@@ -120,6 +126,43 @@ time_clock(self, args)
 }
 #endif /* HAVE_CLOCK */
 
+#ifdef MS_WIN32
+/* Due to Mark Hammond */
+static PyObject *
+time_clock(self, args)
+       PyObject *self;
+       PyObject *args;
+{
+       static LARGE_INTEGER ctrStart;
+       static LARGE_INTEGER divisor = {0,0};
+       LARGE_INTEGER now, diff, rem;
+
+       if (!PyArg_NoArgs(args))
+               return NULL;
+
+       if (LargeIntegerEqualToZero(divisor)) {
+               QueryPerformanceCounter(&ctrStart);
+               if (!QueryPerformanceFrequency(&divisor) || 
+                   LargeIntegerEqualToZero(divisor)) {
+                               /* Unlikely to happen - 
+                                  this works on all intel machines at least! 
+                                  Revert to clock() */
+                       return PyFloat_FromDouble(clock());
+               }
+       }
+       QueryPerformanceCounter(&now);
+       diff = LargeIntegerSubtract(now, ctrStart);
+       diff = LargeIntegerDivide(diff, divisor, &rem);
+       /* XXX - we assume both divide results fit in 32 bits.  This is
+          true on Intels.  First person who can afford a machine that 
+          doesnt deserves to fix it :-)
+       */
+       return PyFloat_FromDouble((double)diff.LowPart + 
+                             ((double)rem.LowPart / (double)divisor.LowPart));
+}
+#define HAVE_CLOCK /* So it gets included in the methods */
+#endif /* MS_WIN32 */
+
 static PyObject *
 time_sleep(self, args)
        PyObject *self;
@@ -131,7 +174,7 @@ time_sleep(self, args)
        Py_BEGIN_ALLOW_THREADS
                if (floatsleep(secs) != 0) {
                        Py_BLOCK_THREADS
-                               return NULL;
+                       return NULL;
                }
        Py_END_ALLOW_THREADS
                Py_INCREF(Py_None);