diff --git a/core/src/main/c/windows/os.c b/core/src/main/c/windows/os.c index f702b2f2307054e992453c4436d7bf3338278e3f..15b79c25dd4af90e90ddeaec07e621410fbeb42f 100644 --- a/core/src/main/c/windows/os.c +++ b/core/src/main/c/windows/os.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "../share/os.h" #include "errno.h" #include "timer.h" @@ -132,6 +133,51 @@ JNIEXPORT jint JNICALL Java_com_questdb_std_Os_setCurrentThreadAffinity0 } +#define exp7 10000000LL //1E+7 //C-file part +#define exp9 1000000000LL //1E+9 +#define w2ux 116444736000000000LL //1.jan1601 to 1.jan1970 + +void unix_time(struct timespec *spec) { + __int64 wintime; + GetSystemTimeAsFileTime((FILETIME *) &wintime); + wintime -= w2ux; + spec->tv_sec = wintime / exp7; + spec->tv_nsec = wintime % exp7 * 100; +} + +int clock_gettime(struct timespec *spec) { + static struct timespec startspec; + static double ticks2nano; + static __int64 startticks, tps = 0; + __int64 tmp, curticks; + + QueryPerformanceFrequency((LARGE_INTEGER *) &tmp); + + if (tps != tmp) { + tps = tmp; //init ~~ONCE + // possibly change freq ? + QueryPerformanceCounter((LARGE_INTEGER *) &startticks); + unix_time(&startspec); + ticks2nano = (double) exp9 / tps; + } + QueryPerformanceCounter((LARGE_INTEGER *) &curticks); + curticks -= startticks; + spec->tv_sec = startspec.tv_sec + (curticks / tps); + spec->tv_nsec = (long) (startspec.tv_nsec + (double) (curticks % tps) * ticks2nano); + if (spec->tv_nsec >= exp9) { + spec->tv_sec++; + spec->tv_nsec -= exp9; + } + return 0; +} + +JNIEXPORT jlong JNICALL Java_com_questdb_std_Os_currentTimeNanos + (JNIEnv *e, jclass cl) { + struct timespec spec; + clock_gettime(&spec); + return spec.tv_sec * 1000000000 + spec.tv_nsec; +} + JNIEXPORT void JNICALL Java_com_questdb_std_Os_freeKrbToken (JNIEnv *e, jclass cl, jlong ptr) { diff --git a/core/src/main/resources/binaries/windows/libquestdb.dll b/core/src/main/resources/binaries/windows/libquestdb.dll index 5d79ec0f63142d362e56e1a00f7e6a96c6acfe10..3d768db5eb33743ecc596299b3e8741e1c9cc84f 100644 Binary files a/core/src/main/resources/binaries/windows/libquestdb.dll and b/core/src/main/resources/binaries/windows/libquestdb.dll differ diff --git a/core/src/test/java/com/questdb/std/OsTest.java b/core/src/test/java/com/questdb/std/OsTest.java index fbbd4a2cbdab938750784edbc3064a3e8dba9ed2..33ea31dcc61a09b08f7900faf1997d7423cab20c 100644 --- a/core/src/test/java/com/questdb/std/OsTest.java +++ b/core/src/test/java/com/questdb/std/OsTest.java @@ -61,7 +61,10 @@ public class OsTest { public void testCurrentTimeNanos() { long reference = System.currentTimeMillis(); long actual = Os.currentTimeNanos(); + Assert.assertTrue(actual > 0); long delta = actual / 1_000_000 - reference; Assert.assertTrue(delta < 200); + System.out.println(reference); + System.out.println(actual); } } \ No newline at end of file