Making use of GetSystemTimePreciseAsFileTime dynamic to not

break compatibility with Windows 7. The issue with rotated logs
was fixed other way.
main
Tomas Kolda 10 years ago
parent 9c2cf9479b
commit 502d41f150
  1. 13
      db/auto_roll_logger.cc
  2. 23
      port/win/env_win.cc

@ -32,8 +32,17 @@ Status AutoRollLogger::ResetLogger() {
}
void AutoRollLogger::RollLogFile() {
std::string old_fname = OldInfoLogFileName(
dbname_, env_->NowMicros(), db_absolute_path_, db_log_dir_);
uint64_t now = env_->NowMicros();
std::string old_fname;
// Try to check target name only 10 times at most
for (int i = 0; i < 10; i++) {
old_fname = OldInfoLogFileName(
dbname_, now, db_absolute_path_, db_log_dir_);
if (!env_->FileExists(old_fname).ok()) {
break;
}
now++;
};
env_->RenameFile(log_fname_, old_fname);
}

@ -1138,6 +1138,8 @@ void WinthreadCall(const char* label, std::error_code result) {
}
}
typedef VOID(WINAPI * FnGetSystemTimePreciseAsFileTime)(LPFILETIME);
class WinEnv : public Env {
public:
WinEnv();
@ -1676,6 +1678,7 @@ class WinEnv : public Env {
}
virtual uint64_t NowMicros() override {
if (GetSystemTimePreciseAsFileTime_ != NULL) {
// all std::chrono clocks on windows proved to return
// values that may repeat that is not good enough for some uses.
const int64_t c_UnixEpochStartTicks = 116444736000000000i64;
@ -1685,7 +1688,7 @@ class WinEnv : public Env {
// just any microseconds because it is often used as an argument
// to TimedWait() on condition variable
FILETIME ftSystemTime;
GetSystemTimePreciseAsFileTime(&ftSystemTime);
GetSystemTimePreciseAsFileTime_(&ftSystemTime);
LARGE_INTEGER li;
li.LowPart = ftSystemTime.dwLowDateTime;
@ -1696,6 +1699,9 @@ class WinEnv : public Env {
li.QuadPart /= c_FtToMicroSec;
return li.QuadPart;
}
using namespace std::chrono;
return duration_cast<microseconds>(system_clock::now().time_since_epoch()).count();
}
virtual uint64_t NowNanos() override {
// all std::chrono clocks on windows have the same resolution that is only
@ -2104,8 +2110,13 @@ class WinEnv : public Env {
std::vector<ThreadPool> thread_pools_;
mutable std::mutex mu_;
std::vector<std::thread> threads_to_join_;
static FnGetSystemTimePreciseAsFileTime GetSystemTimePreciseAsFileTime_;
static bool GetSystemTimePreciseAsFileTimeInitialized_;
};
FnGetSystemTimePreciseAsFileTime WinEnv::GetSystemTimePreciseAsFileTime_ = NULL;
bool WinEnv::GetSystemTimePreciseAsFileTimeInitialized_ = false;
WinEnv::WinEnv()
: checkedDiskForMmap_(false),
forceMmapOff(false),
@ -2113,6 +2124,16 @@ WinEnv::WinEnv()
allocation_granularity_(page_size_),
perf_counter_frequency_(0),
thread_pools_(Priority::TOTAL) {
if (!GetSystemTimePreciseAsFileTimeInitialized_) {
HMODULE module = GetModuleHandle("kernel32.dll");
if (module != NULL) {
GetSystemTimePreciseAsFileTime_ = (FnGetSystemTimePreciseAsFileTime)GetProcAddress(
module, "GetSystemTimePreciseAsFileTime");
}
GetSystemTimePreciseAsFileTimeInitialized_ = true;
}
SYSTEM_INFO sinfo;
GetSystemInfo(&sinfo);

Loading…
Cancel
Save