Win32 precision clock() -- Mark Hammond.
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 1f55933..9a8fb8b 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -79,6 +79,12 @@
 #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 @@
 }
 #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 @@
 	Py_BEGIN_ALLOW_THREADS
 		if (floatsleep(secs) != 0) {
 			Py_BLOCK_THREADS
-				return NULL;
+			return NULL;
 		}
 	Py_END_ALLOW_THREADS
 		Py_INCREF(Py_None);