blob: 2b551e415c2d6089fad4e5769290822bc0ea4364 [file] [log] [blame]
//
// GTMTimeUtils.m
//
// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//
#import "GTMTimeUtils.h"
#include <sys/sysctl.h>
#import "GTMDefines.h"
NSTimeInterval GTMTimeValToNSTimeInterval(struct timeval time) {
return time.tv_sec + (time.tv_usec / (double)USEC_PER_SEC);
}
struct timeval GTMBootTimeRelativeTo1970(void) {
struct timeval bootTime = { 0, 0 };
int mib[2] = { CTL_KERN, KERN_BOOTTIME };
size_t bootTimeSize = sizeof(bootTime);
if (sysctl(mib, 2, &bootTime, &bootTimeSize, NULL, 0) != 0) {
_GTMDevAssert(errno == 0, @"sysctl error - %d", errno);
struct timeval invalid = { 0, 0 };
return invalid;
}
return bootTime;
}
struct timeval GTMAppLaunchTimeRelativeTo1970(void) {
id_t pid = getpid();
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)pid };
const size_t mibSize = sizeof(mib) / sizeof(mib[0]);
size_t infoSize = 0;
// Get initial size of KERN_PROC data structure.
if (sysctl(mib, mibSize, NULL, &infoSize, NULL, 0) != 0) {
_GTMDevAssert(errno == 0, @"sysctl error - %d", errno);
struct timeval invalid = { 0, 0 };
return invalid;
}
struct kinfo_proc info;
if (sysctl(mib, mibSize, &info, &infoSize, NULL, 0) != 0) {
_GTMDevAssert(errno == 0, @"sysctl error - %d", errno);
struct timeval invalid = { 0, 0 };
return invalid;
}
return info.kp_proc.p_starttime;
}
NSDate *GTMAppLaunchDate() {
NSTimeInterval ti =
GTMTimeValToNSTimeInterval(GTMAppLaunchTimeRelativeTo1970());
return [NSDate dateWithTimeIntervalSince1970:ti];
}
NSDate *GTMBootDate() {
NSTimeInterval ti =
GTMTimeValToNSTimeInterval(GTMBootTimeRelativeTo1970());
return [NSDate dateWithTimeIntervalSince1970:ti];
}