1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 79ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein#include "SysTimer_mach.h" 8be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com 99ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinstatic time_value_t mac_cpu_time() { 10be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com mach_port_t task = mach_task_self(); 11be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com if (task == MACH_PORT_NULL) { 12be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com time_value_t none = {0, 0}; 13be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com return none; 14be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com } 15fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 16be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com task_thread_times_info thread_info_data; 17be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com mach_msg_type_number_t thread_info_count = TASK_THREAD_TIMES_INFO_COUNT; 18be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com if (KERN_SUCCESS != task_info(task, 199ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein TASK_THREAD_TIMES_INFO, 209ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein reinterpret_cast<task_info_t>(&thread_info_data), 219ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein &thread_info_count)) { 22be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com time_value_t none = {0, 0}; 23be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com return none; 24be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com } 25fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 26be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com time_value_add(&thread_info_data.user_time, &thread_info_data.system_time) 27be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com return thread_info_data.user_time; 28be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com} 29be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com 309ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinstatic double interval_in_ms(time_value_t start_clock, time_value_t end_clock) { 31be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com double duration_clock; 32be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com if ((end_clock.microseconds - start_clock.microseconds) < 0) { 339ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein duration_clock = (end_clock.seconds - start_clock.seconds-1) * 1000; 349ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein duration_clock += (1000000 + end_clock.microseconds - start_clock.microseconds) / 1000.0; 35be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com } else { 369ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein duration_clock = (end_clock.seconds - start_clock.seconds) * 1000; 379ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein duration_clock += (end_clock.microseconds - start_clock.microseconds) / 1000.0; 38be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com } 39be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com return duration_clock; 40be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com} 41be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com 429ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinvoid SysTimer::startWall() { 439ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein fStartWall = mach_absolute_time(); 44be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com} 459ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein 469ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinvoid SysTimer::startCpu() { 479ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein fStartCpu = mac_cpu_time(); 48be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com} 49be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com 509ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleindouble SysTimer::endCpu() { 519ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein time_value_t end_cpu = mac_cpu_time(); 529ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein return interval_in_ms(fStartCpu, end_cpu); 53be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com} 549ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein 559ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleindouble SysTimer::endWall() { 56be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com uint64_t end_wall = mach_absolute_time(); 57fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 589ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein uint64_t elapsed = end_wall - fStartWall; 59be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com mach_timebase_info_data_t sTimebaseInfo; 60be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com if (KERN_SUCCESS != mach_timebase_info(&sTimebaseInfo)) { 61be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com return 0; 62be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com } else { 639ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein uint64_t elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom; 644c07b6b58f58bc4bcf7b7749076b38a4de843590mtklein return elapsedNano / 1000000.0; 65be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com } 66be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com} 67