diff --git a/source/os/src/osTime.c b/source/os/src/osTime.c index 2771c8064fa274c49202911ec2d5baf86b9452f9..68dfba14e95a0bb34af7c60793f6af8bda234a7f 100644 --- a/source/os/src/osTime.c +++ b/source/os/src/osTime.c @@ -554,17 +554,26 @@ int32_t taosClockGetTime(int clock_id, struct timespec *pTS) { static SYSTEMTIME ss; static LARGE_INTEGER offset; - ss.wYear = 1970; - ss.wMonth = 1; - ss.wDay = 1; - ss.wHour = 0; - ss.wMinute = 0; - ss.wSecond = 0; - ss.wMilliseconds = 0; - SystemTimeToFileTime(&ss, &ff); - offset.QuadPart = ff.dwHighDateTime; - offset.QuadPart <<= 32; - offset.QuadPart |= ff.dwLowDateTime; + static int8_t offsetInit = 0; + static volatile bool offsetInitFinished = false; + int8_t old = atomic_val_compare_exchange_8(&offsetInit, 0, 1); + if (0 == old) { + ss.wYear = 1970; + ss.wMonth = 1; + ss.wDay = 1; + ss.wHour = 0; + ss.wMinute = 0; + ss.wSecond = 0; + ss.wMilliseconds = 0; + SystemTimeToFileTime(&ss, &ff); + offset.QuadPart = ff.dwHighDateTime; + offset.QuadPart <<= 32; + offset.QuadPart |= ff.dwLowDateTime; + offsetInitFinished = true; + } else { + while (!offsetInitFinished) + ; // Ensure initialization is completed. + } GetSystemTimeAsFileTime(&f); t.QuadPart = f.dwHighDateTime;