From 1057c99ca375a6b53ca079cede47fe2e9dce4d8b Mon Sep 17 00:00:00 2001 From: dmaclach Date: Thu, 3 Jan 2019 08:22:28 -0800 Subject: Add GTMTimeUtils (#229) Utilities for relatively common desire to know the launch time of an app, or the boot time of a device. --- Foundation/GTMTimeUtils.m | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Foundation/GTMTimeUtils.m (limited to 'Foundation/GTMTimeUtils.m') diff --git a/Foundation/GTMTimeUtils.m b/Foundation/GTMTimeUtils.m new file mode 100644 index 0000000..2b551e4 --- /dev/null +++ b/Foundation/GTMTimeUtils.m @@ -0,0 +1,72 @@ +// +// 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 + +#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]; +} -- cgit v1.2.3