|  | 
 | /* | 
 |  * Copyright 2011 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 | #include "BenchSysTimer_mach.h" | 
 |  | 
 | //Time | 
 | #include <mach/mach.h> | 
 | #include <mach/mach_time.h> | 
 |  | 
 | static time_value_t macCpuTime() { | 
 |     mach_port_t task = mach_task_self(); | 
 |     if (task == MACH_PORT_NULL) { | 
 |         time_value_t none = {0, 0}; | 
 |         return none; | 
 |     } | 
 |  | 
 |     task_thread_times_info thread_info_data; | 
 |     mach_msg_type_number_t thread_info_count = TASK_THREAD_TIMES_INFO_COUNT; | 
 |     if (KERN_SUCCESS != task_info(task, | 
 |                  TASK_THREAD_TIMES_INFO, | 
 |                  reinterpret_cast<task_info_t>(&thread_info_data), | 
 |                  &thread_info_count)) | 
 |     { | 
 |         time_value_t none = {0, 0}; | 
 |         return none; | 
 |     } | 
 |  | 
 |     time_value_add(&thread_info_data.user_time, &thread_info_data.system_time) | 
 |     return thread_info_data.user_time; | 
 | } | 
 |  | 
 | static double intervalInMSec(const time_value_t start_clock | 
 |                            , const time_value_t end_clock) | 
 | { | 
 |     double duration_clock; | 
 |     if ((end_clock.microseconds - start_clock.microseconds) < 0) { | 
 |         duration_clock = (end_clock.seconds - start_clock.seconds-1)*1000; | 
 |         duration_clock += (1000000 | 
 |                            + end_clock.microseconds | 
 |                            - start_clock.microseconds) / 1000.0; | 
 |     } else { | 
 |         duration_clock = (end_clock.seconds - start_clock.seconds)*1000; | 
 |         duration_clock += (end_clock.microseconds - start_clock.microseconds) | 
 |                            / 1000.0; | 
 |     } | 
 |     return duration_clock; | 
 | } | 
 |  | 
 | void BenchSysTimer::startWall() { | 
 |     this->fStartWall = mach_absolute_time(); | 
 | } | 
 | void BenchSysTimer::startCpu() { | 
 |     this->fStartCpu = macCpuTime(); | 
 | } | 
 |  | 
 | double BenchSysTimer::endCpu() { | 
 |     time_value_t end_cpu = macCpuTime(); | 
 |     return intervalInMSec(this->fStartCpu, end_cpu); | 
 | } | 
 | double BenchSysTimer::endWall() { | 
 |     uint64_t end_wall = mach_absolute_time(); | 
 |  | 
 |     uint64_t elapsed = end_wall - this->fStartWall; | 
 |     mach_timebase_info_data_t sTimebaseInfo; | 
 |     if (KERN_SUCCESS != mach_timebase_info(&sTimebaseInfo)) { | 
 |         return 0; | 
 |     } else { | 
 |         uint64_t elapsedNano = elapsed * sTimebaseInfo.numer | 
 |                                / sTimebaseInfo.denom; | 
 |         return elapsedNano / 1000000; | 
 |     } | 
 | } |