summaryrefslogtreecommitdiffstats
path: root/win/tclWinTime.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/tclWinTime.c')
-rw-r--r--win/tclWinTime.c64
1 files changed, 55 insertions, 9 deletions
diff --git a/win/tclWinTime.c b/win/tclWinTime.c
index 3a2ba8d..4835bf1 100644
--- a/win/tclWinTime.c
+++ b/win/tclWinTime.c
@@ -45,15 +45,15 @@ typedef struct TimeCalibInfo {
LONGLONG perfCounter; /* QPC value of last calibrated virtual time */
Tcl_WideInt virtTimeBase; /* Last virtual time base (in 100-ns) */
Tcl_WideInt sysTime; /* Last real system time (in 100-ns),
- truncated to VT_SYSTMR_DIST (100ms) */
+ truncated to VT_SYSTMR_DIST (100ms) */
} TimeCalibInfo;
/* Milliseconds <-> 100-ns ticks */
-#define MsToT100ns(ms) (ms * 10000)
-#define T100nsToMs(ms) (ms / 10000)
+#define MsToT100ns(ms) ((ms) * 10000)
+#define T100nsToMs(ms) ((ms) / 10000)
/* Microseconds <-> 100-ns ticks */
-#define UsToT100ns(ms) (ms * 10)
-#define T100nsToUs(ms) (ms / 10)
+#define UsToT100ns(ms) ((ms) * 10)
+#define T100nsToUs(ms) ((ms) / 10)
/*
@@ -103,7 +103,8 @@ typedef struct TimeInfo {
size_t lastUsedTime; /* Last known (caller) offset to virtual time
* (used to avoid back-drifts after calibrate) */
-
+ size_t lastTimeJumpEpoch; /* Last known epoch since last time-jump. */
+ Tcl_WideInt lastTimeJump; /* Last known time-jump of thread. */
} TimeInfo;
static TimeInfo timeInfo = {
@@ -415,7 +416,7 @@ TclpWideClickInMicrosec(void)
Tcl_WideInt
TclpGetMicroseconds(void)
{
-#if 0
+#if 1
/* Use high resolution timer if possible */
if (tclGetTimeProcPtr == NativeGetTime) {
return NativeGetMicroseconds();
@@ -428,7 +429,7 @@ TclpGetMicroseconds(void)
Tcl_Time now;
tclGetTimeProcPtr(&now, tclTimeClientData); /* Tcl_GetTime inlined */
- return (((Tcl_WideInt)now.sec) * 1000000) + now.usec;
+ return TCL_TIME_TO_USEC(now);
}
#else
@@ -563,6 +564,34 @@ NativeScaleTime(
/*
*----------------------------------------------------------------------
*
+ * TclpScaleUTime --
+ *
+ * This procedure scales number of microseconds if expected.
+ *
+ * Results:
+ * Number of microseconds scaled using tclScaleTimeProcPtr.
+ *
+ *----------------------------------------------------------------------
+ */
+Tcl_WideInt
+TclpScaleUTime(
+ Tcl_WideInt usec)
+{
+ /* Native scale is 1:1. */
+ if (tclScaleTimeProcPtr == NativeScaleTime) {
+ return usec;
+ } else {
+ Tcl_Time scTime;
+ scTime.sec = usec / 1000000;
+ scTime.usec = usec % 1000000;
+ tclScaleTimeProcPtr(&scTime, tclTimeClientData);
+ return ((Tcl_WideInt)scTime.sec) * 1000000 + scTime.usec;
+ }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* NativeGetMicroseconds --
*
* Gets the current system time in microseconds since the beginning
@@ -719,7 +748,7 @@ NativeGetMicroseconds(void)
timeInfo.lastCI.sysTime =
timeInfo.lastCI.virtTimeBase = GetSystemTimeAsVirtual();
-
+ timeInfo.lastTimeJumpEpoch = 1; /* let the caller know we've epoch */
}
timeInfo.initialized = TRUE;
}
@@ -826,6 +855,8 @@ NativeGetMicroseconds(void)
* The time-jump (reset or initial), we should use system time
* instead of virtual to recalibrate offsets (let the time jump).
*/
+ timeInfo.lastTimeJump = T100nsToUs(sysTime - vt0); /* 100-ns */;
+ timeInfo.lastTimeJumpEpoch++;
vt0 = sysTime;
//!!! printf("************* reset time: %I64d *****************\n", vt0);
}
@@ -1342,6 +1373,21 @@ Tcl_QueryTimeProc(
}
}
+Tcl_WideInt
+TclpGetLastTimeJump(size_t *epoch)
+{
+ if (timeInfo.lastTimeJumpEpoch > *epoch) {
+ *epoch = timeInfo.lastTimeJumpEpoch;
+ return timeInfo.lastTimeJump;
+ };
+ return 0;
+}
+size_t
+TclpGetLastTimeJumpEpoch(void)
+{
+ return timeInfo.lastTimeJumpEpoch;
+}
+
/*
* Local Variables:
* mode: c