/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * Implementation of the OS-independent methods of the TimeStamp class */ #include "mozilla/TimeStamp.h" #include "prenv.h" namespace mozilla { TimeStamp TimeStamp::sFirstTimeStamp; TimeStamp TimeStamp::sProcessCreation; TimeStamp TimeStamp::ProcessCreation(bool& aIsInconsistent) { aIsInconsistent = false; if (sProcessCreation.IsNull()) { char *mozAppRestart = PR_GetEnv("MOZ_APP_RESTART"); TimeStamp ts; /* When calling PR_SetEnv() with an empty value the existing variable may * be unset or set to the empty string depending on the underlying platform * thus we have to check if the variable is present and not empty. */ if (mozAppRestart && (strcmp(mozAppRestart, "") != 0)) { /* Firefox was restarted, use the first time-stamp we've taken as the new * process startup time. */ ts = sFirstTimeStamp; } else { TimeStamp now = Now(); uint64_t uptime = ComputeProcessUptime(); ts = now - TimeDuration::FromMicroseconds(uptime); if ((ts > sFirstTimeStamp) || (uptime == 0)) { /* If the process creation timestamp was inconsistent replace it with * the first one instead and notify that a telemetry error was * detected. */ aIsInconsistent = true; ts = sFirstTimeStamp; } } sProcessCreation = ts; } return sProcessCreation; } void TimeStamp::RecordProcessRestart() { sProcessCreation = TimeStamp(); } } // namespace mozilla