Skip to content

Commit

Permalink
Merge pull request #65 from owent/dev
Browse files Browse the repository at this point in the history
Update time APIs, add nanos API
  • Loading branch information
owent authored Jul 19, 2024
2 parents 8b7c960 + 04baa50 commit 8e96be5
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 150 deletions.
1 change: 0 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,6 @@ set(HEADER_LIST
"${CMAKE_CURRENT_LIST_DIR}/include/random/random_xoshiro_core.h"
"${CMAKE_CURRENT_LIST_DIR}/include/random/uuid_generator.h"
"${CMAKE_CURRENT_LIST_DIR}/include/std/array.h"
"${CMAKE_CURRENT_LIST_DIR}/include/std/atomic.h"
"${CMAKE_CURRENT_LIST_DIR}/include/std/chrono.h"
"${CMAKE_CURRENT_LIST_DIR}/include/std/explicit_declare.h"
"${CMAKE_CURRENT_LIST_DIR}/include/std/functional.h"
Expand Down
130 changes: 0 additions & 130 deletions include/std/atomic.h

This file was deleted.

30 changes: 21 additions & 9 deletions include/time/time_utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
# define __STDC_WANT_LIB_EXT1__ 1
#endif

#include <config/atframe_utils_build_feature.h>

#include <stdint.h>
#include <cstddef>
#include <cstring>
#include <ctime>

#include "std/chrono.h"

#include <config/atframe_utils_build_feature.h>

#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || defined(__STDC_LIB_EXT1__)
# define UTIL_STRFUNC_LOCALTIME_S(time_t_ptr, tm_ptr) localtime_s(time_t_ptr, tm_ptr)
# define UTIL_STRFUNC_GMTIME_S(time_t_ptr, tm_ptr) gmtime_s(time_t_ptr, tm_ptr)
Expand All @@ -37,8 +37,9 @@
# define UTIL_STRFUNC_GMTIME_S(time_t_ptr, tm_ptr) gmtime_r(time_t_ptr, tm_ptr)

#else
# define UTIL_STRFUNC_LOCALTIME_S(time_t_ptr, tm_ptr) (*(tm_ptr) = *localtime(time_t_ptr))
# define UTIL_STRFUNC_GMTIME_S(time_t_ptr, tm_ptr) (*(tm_ptr) = *gmtime(time_t_ptr))
# define UTIL_STRFUNC_LOCALTIME_S(time_t_ptr, tm_ptr) \
(*(tm_ptr) = *localtime(time_t_ptr)) // NOLINT: runtime/threadsafe_fn
# define UTIL_STRFUNC_GMTIME_S(time_t_ptr, tm_ptr) (*(tm_ptr) = *gmtime(time_t_ptr)) // NOLINT: runtime/threadsafe_fn

#endif

Expand Down Expand Up @@ -85,12 +86,20 @@ class time_utility {
/**
* @brief 获取当前时间的微秒部分
* @note 为了减少系统调用,这里仅在update时更新缓存,并且使用偏移值进行计算,所以大部分情况下都会偏小一些。
* 这里仅为能够容忍误差的时间相关的功能提供一个时间参考,如果需要使用精确时间,请使用系统调用
* @note update接口不加锁,所以一般情况下,返回值在[0,
* 1000000)之间,极端情况下(特别是多线程调用时)可能出现大于1000000
* 这里仅为能够容忍误差的时间相关的功能提供一个时间参考,如果需要使用精确时间,请使用系统接口或STL接口
* @note update接口不加锁,所以一般情况下,返回值在[0, 1000000)之间
* @return 当前时间的微妙部分
*/
static LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD time_t get_now_usec();
static LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD int32_t get_now_usec();

/**
* @brief 获取当前时间的纳秒部分
* @note 为了减少系统调用,这里仅在update时更新缓存,并且使用偏移值进行计算,所以大部分情况下都会偏小一些。
* 这里仅为能够容忍误差的时间相关的功能提供一个时间参考,如果需要使用精确时间,请使用系统接口或STL接口
* @note update接口不加锁,所以一般情况下,返回值在[0, 1000000000)之间
* @return 当前时间的微秒部分
*/
static LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD int32_t get_now_nanos();

/**
* @brief 获取原始系统时间对象,不受set_global_now_offset()影响
Expand Down Expand Up @@ -308,7 +317,10 @@ class time_utility {
static LIBATFRAME_UTILS_API time_t now_unix_;

// 当前时间(微妙,非精确)
static LIBATFRAME_UTILS_API time_t now_usec_;
static LIBATFRAME_UTILS_API int32_t now_usec_;

// 当前时间(纳秒,非精确)
static LIBATFRAME_UTILS_API int32_t now_nanos_;

// 时区时间的人为偏移
static LIBATFRAME_UTILS_API time_t custom_zone_offset_;
Expand Down
25 changes: 15 additions & 10 deletions src/time/time_utility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ LIBATFRAME_UTILS_NAMESPACE_BEGIN
namespace time {
LIBATFRAME_UTILS_API time_utility::raw_time_t time_utility::now_;
LIBATFRAME_UTILS_API time_t time_utility::now_unix_;
LIBATFRAME_UTILS_API time_t time_utility::now_usec_ = 0;
LIBATFRAME_UTILS_API int32_t time_utility::now_usec_ = 0;
LIBATFRAME_UTILS_API int32_t time_utility::now_nanos_ = 0;
LIBATFRAME_UTILS_API time_t time_utility::custom_zone_offset_ = -time_utility::YEAR_SECONDS;
LIBATFRAME_UTILS_API std::chrono::system_clock::duration time_utility::global_now_offset_ =
std::chrono::system_clock::duration::zero();
Expand All @@ -27,20 +28,24 @@ LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD void time_utility::update(raw_time
// reset usec
LIBATFRAME_UTILS_NAMESPACE_ID::time::time_utility::raw_time_t padding_time =
LIBATFRAME_UTILS_NAMESPACE_ID::time::time_utility::raw_time_t::clock::from_time_t(now_unix_);
now_usec_ = static_cast<time_t>(std::chrono::duration_cast<std::chrono::microseconds>(
LIBATFRAME_UTILS_NAMESPACE_ID::time::time_utility::now() - padding_time)
.count());
if (now_usec_ < 0) {
now_usec_ = 0;
}
if (now_usec_ >= 1000000) {
now_usec_ = 999999;
std::chrono::nanoseconds::rep nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(
LIBATFRAME_UTILS_NAMESPACE_ID::time::time_utility::now() - padding_time)
.count();

if (nanos < 0) {
nanos = 0;
} else if (nanos >= 1000000000) {
nanos = 999999999;
}
now_nanos_ = static_cast<int32_t>(nanos);
now_usec_ = static_cast<int32_t>(nanos) / 1000;
}

LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD time_utility::raw_time_t time_utility::now() { return now_; }

LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD time_t time_utility::get_now_usec() { return now_usec_; }
LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD int32_t time_utility::get_now_usec() { return now_usec_; }

LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD int32_t time_utility::get_now_nanos() { return now_nanos_; }

LIBATFRAME_UTILS_API UTIL_SANITIZER_NO_THREAD time_t time_utility::get_now() { return now_unix_; }

Expand Down

0 comments on commit 8e96be5

Please sign in to comment.