mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 20:25:34 +08:00
[feat] add clock module
This commit is contained in:
122
src/common/clock/system_clock.cpp
Normal file
122
src/common/clock/system_clock.cpp
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
#include "system_clock.h"
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
#if defined(__POSIX__)
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
#include <mach/mach_time.h>
|
||||||
|
#endif
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentTimeNs() {
|
||||||
|
int64_t ticks = -1; // Default to error case
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
static mach_timebase_info_data_t timebase;
|
||||||
|
if (timebase.denom == 0 && mach_timebase_info(&timebase) != KERN_SUCCESS) {
|
||||||
|
return -1; // Error case for macOS timebase info retrieval
|
||||||
|
}
|
||||||
|
ticks = static_cast<int64_t>(mach_absolute_time() * timebase.numer) /
|
||||||
|
timebase.denom;
|
||||||
|
|
||||||
|
#elif defined(__POSIX__)
|
||||||
|
struct timespec ts;
|
||||||
|
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
|
||||||
|
return -1; // Error case for POSIX clock retrieval
|
||||||
|
}
|
||||||
|
ticks = static_cast<int64_t>(ts.tv_sec) * kNumNanosecsPerSec +
|
||||||
|
static_cast<int64_t>(ts.tv_nsec);
|
||||||
|
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
static volatile LONG last_timegettime = 0;
|
||||||
|
static volatile int64_t num_wrap_timegettime = 0;
|
||||||
|
volatile LONG* last_timegettime_ptr = &last_timegettime;
|
||||||
|
|
||||||
|
DWORD now = timeGetTime();
|
||||||
|
DWORD old = InterlockedExchange(last_timegettime_ptr, now);
|
||||||
|
|
||||||
|
if (now < old) {
|
||||||
|
// Handle wraparound (when timeGetTime() wraps around after ~49.7 days)
|
||||||
|
if (old > 0xf0000000 && now < 0x0fffffff) {
|
||||||
|
num_wrap_timegettime++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert milliseconds to nanoseconds and add wraparound offset
|
||||||
|
ticks = static_cast<int64_t>(now) + (num_wrap_timegettime << 32);
|
||||||
|
ticks *= 1000000;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentTimeUs() { return CurrentTimeNs() / 1000LL; }
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentTimeMs() { return CurrentTimeNs() / 1000000LL; }
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentTime() { return CurrentTimeNs() / 1000000000LL; }
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentNtpTime() {
|
||||||
|
int64_t current_time_s = CurrentTime();
|
||||||
|
return current_time_s + kNtpEpochOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentNtpTimeMs() {
|
||||||
|
return CurrentTimeMs() + kNtpEpochOffset * 1000LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentNtpTimeUs() {
|
||||||
|
return CurrentTimeUs() + kNtpEpochOffset * 1000000LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentNtpTimeNs() {
|
||||||
|
return CurrentTimeNs() + kNtpEpochOffset * 1000000000LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentUtcTimeNs() {
|
||||||
|
#if defined(__POSIX__)
|
||||||
|
struct timeval time;
|
||||||
|
gettimeofday(&time, nullptr);
|
||||||
|
return (static_cast<int64_t>(time.tv_sec) * 1000000000 + time.tv_usec * 1000);
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
FILETIME file_time;
|
||||||
|
GetSystemTimeAsFileTime(&file_time);
|
||||||
|
int64_t file_time_100ns =
|
||||||
|
((int64_t)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime;
|
||||||
|
constexpr int64_t kUnixEpochFileTimeOffsetIn100ns = 116444736000000000LL;
|
||||||
|
return (file_time_100ns - kUnixEpochFileTimeOffsetIn100ns) * 100;
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
struct timespec ts;
|
||||||
|
if (clock_gettime(CLOCK_REALTIME, &ts) != 0) {
|
||||||
|
return -1; // Error case for macOS clock retrieval
|
||||||
|
}
|
||||||
|
return static_cast<int64_t>(ts.tv_sec) * 1000000000LL + ts.tv_nsec;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentUtcTimeUs() { return CurrentUtcTimeNs() / 1000LL; }
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentUtcTimeMs() {
|
||||||
|
return CurrentUtcTimeNs() / 1000000LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t SystemClock::CurrentUtcTime() {
|
||||||
|
return CurrentUtcTimeNs() / 1000000000LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SystemClock* GetSystemClock() {
|
||||||
|
static SystemClock* const clock = new SystemClock();
|
||||||
|
return clock;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<SystemClock> GetSystemClockShared() {
|
||||||
|
return std::make_shared<SystemClock>();
|
||||||
|
}
|
||||||
39
src/common/clock/system_clock.h
Normal file
39
src/common/clock/system_clock.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* @Author: DI JUNKUN
|
||||||
|
* @Date: 2025-02-19
|
||||||
|
* Copyright (c) 2025 by DI JUNKUN, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SYSTEM_CLOCK_H_
|
||||||
|
#define _SYSTEM_CLOCK_H_
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
static const int64_t kNtpEpochOffset = 2208988800LL;
|
||||||
|
|
||||||
|
class SystemClock {
|
||||||
|
public:
|
||||||
|
SystemClock() = default;
|
||||||
|
~SystemClock() = default;
|
||||||
|
|
||||||
|
int64_t CurrentTime();
|
||||||
|
int64_t CurrentTimeMs();
|
||||||
|
int64_t CurrentTimeUs();
|
||||||
|
int64_t CurrentTimeNs();
|
||||||
|
|
||||||
|
int64_t CurrentNtpTime();
|
||||||
|
int64_t CurrentNtpTimeMs();
|
||||||
|
int64_t CurrentNtpTimeUs();
|
||||||
|
int64_t CurrentNtpTimeNs();
|
||||||
|
|
||||||
|
int64_t CurrentUtcTime();
|
||||||
|
int64_t CurrentUtcTimeMs();
|
||||||
|
int64_t CurrentUtcTimeUs();
|
||||||
|
int64_t CurrentUtcTimeNs();
|
||||||
|
};
|
||||||
|
|
||||||
|
static SystemClock* GetSystemClock();
|
||||||
|
static std::shared_ptr<SystemClock> GetSystemClockShared();
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -43,6 +43,7 @@ target("common")
|
|||||||
set_kind("object")
|
set_kind("object")
|
||||||
add_deps("log")
|
add_deps("log")
|
||||||
add_files("src/common/common.cpp",
|
add_files("src/common/common.cpp",
|
||||||
|
"src/common/clock/system_clock.cpp",
|
||||||
"src/common/rtc_base/*.cc",
|
"src/common/rtc_base/*.cc",
|
||||||
"src/common/rtc_base/network/*.cc",
|
"src/common/rtc_base/network/*.cc",
|
||||||
"src/common/rtc_base/numerics/*.cc",
|
"src/common/rtc_base/numerics/*.cc",
|
||||||
|
|||||||
Reference in New Issue
Block a user