-
Notifications
You must be signed in to change notification settings - Fork 84
Open
Description
是否考虑将base_ns_ , base_tsc_ 写入一个128位整数,下面这段
代码可能就不需要使用 param_seq_ 和 atomic_signal_fence。保证这两个数是原子读。saveParam 写入一样
ns_per_tsc_ 这个变量通常不会太大变化。
inline int64_t tsc2ns(int64_t tsc) const {
while (true) {
uint32_t before_seq = param_seq_.load(std::memory_order_acquire) & ~1;
std::atomic_signal_fence(std::memory_order_acq_rel);
int64_t ns = base_ns_ + (int64_t)((tsc - base_tsc_) * ns_per_tsc_);
std::atomic_signal_fence(std::memory_order_acq_rel);
uint32_t after_seq = param_seq_.load(std::memory_order_acquire);
if (before_seq == after_seq) return ns;
}
}
int64_t tsc2ns(int64_t tsc) const {
Int128 combined = combined_data_.load(std::memory_order_relaxed);
int64_t base_ns, base_tsc;
split(combined, base_ns, base_tsc);
double ns_per_tsc = ns_per_tsc_.load(std::memory_order_relaxed);
return base_ns + static_cast<int64_t>((tsc - base_tsc) * ns_per_tsc);
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels