// // 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]; }