为Apache AGE实现基于SYSTEMTIME的Windows版clock_gettime()
实现接收SYSTEMTIME参数的clock_gettime函数(MSVC环境)
针对Apache-Age编译时遇到的MSVC不支持CLOCK_REALTIME参数的问题,这里提供一个直接接收SYSTEMTIME参数、输出timespec结构体的自定义clock_gettime实现:
函数实现
#include <windows.h> #include <time.h> int clock_gettime(SYSTEMTIME* st, struct timespec* ts) { // 空指针检查 if (!st || !ts) { return -1; } FILETIME ft; // 将SYSTEMTIME转换为FILETIME(以100纳秒为单位的UTC时间) SystemTimeToFileTime(st, &ft); // 用ULARGE_INTEGER处理64位时间值 ULARGE_INTEGER uli; uli.LowPart = ft.dwLowDateTime; uli.HighPart = ft.dwHighDateTime; // 转换为秒和纳秒 const unsigned long long hundred_ns_per_sec = 10000000ULL; ts->tv_sec = (time_t)(uli.QuadPart / hundred_ns_per_sec); ts->tv_nsec = (long)((uli.QuadPart % hundred_ns_per_sec) * 100); return 0; }
使用说明
- 将上述代码添加到项目中(比如单独写一个
win_clock.c文件,或者直接嵌入agetype.c) - 在
agetype.c调用clock_gettime之前,添加函数声明:int clock_gettime(SYSTEMTIME* st, struct timespec* ts); - 原代码中
GetSystemTime(&st); clock_gettime(&st, &ts);的调用逻辑可以直接保留,无需修改
逻辑说明
SYSTEMTIME通过SystemTimeToFileTime转换为FILETIME,后者是Windows系统中便于计算的64位时间格式(单位为100纳秒)- 利用
ULARGE_INTEGER对64位时间值做除法和取余,分别得到秒数和剩余的100纳秒数,再转换为纳秒 - 返回值
0表示成功,-1表示参数非法(空指针)
内容的提问来源于stack exchange,提问作者Sarthak
相关产品推荐
相关产品推荐

