|  | /* | 
|  | *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "webrtc/system_wrappers/source/trace_posix.h" | 
|  |  | 
|  | #include <assert.h> | 
|  | #include <stdarg.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <sys/time.h> | 
|  | #include <time.h> | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | TracePosix::TracePosix() { | 
|  | struct timeval system_time_high_res; | 
|  | gettimeofday(&system_time_high_res, 0); | 
|  | prev_api_tick_count_ = prev_tick_count_ = system_time_high_res.tv_sec; | 
|  | } | 
|  |  | 
|  | int32_t TracePosix::AddTime(char* trace_message, const TraceLevel level) const { | 
|  | struct timeval system_time_high_res; | 
|  | if (gettimeofday(&system_time_high_res, 0) == -1) { | 
|  | return -1; | 
|  | } | 
|  | struct tm buffer; | 
|  | const struct tm* system_time = | 
|  | localtime_r(&system_time_high_res.tv_sec, &buffer); | 
|  |  | 
|  | const uint32_t ms_time = system_time_high_res.tv_usec / 1000; | 
|  | uint32_t prev_tickCount = 0; | 
|  | { | 
|  | rtc::CritScope lock(&crit_sect_); | 
|  | if (level == kTraceApiCall) { | 
|  | prev_tickCount = prev_tick_count_; | 
|  | prev_tick_count_ = ms_time; | 
|  | } else { | 
|  | prev_tickCount = prev_api_tick_count_; | 
|  | prev_api_tick_count_ = ms_time; | 
|  | } | 
|  | } | 
|  |  | 
|  | uint32_t dw_delta_time = ms_time - prev_tickCount; | 
|  | if (prev_tickCount == 0) { | 
|  | dw_delta_time = 0; | 
|  | } | 
|  | if (dw_delta_time > 0x0fffffff) { | 
|  | // Either wraparound or data race. | 
|  | dw_delta_time = 0; | 
|  | } | 
|  | if (dw_delta_time > 99999) { | 
|  | dw_delta_time = 99999; | 
|  | } | 
|  |  | 
|  | sprintf(trace_message, "(%2u:%2u:%2u:%3u |%5lu) ", system_time->tm_hour, | 
|  | system_time->tm_min, system_time->tm_sec, ms_time, | 
|  | static_cast<unsigned long>(dw_delta_time)); | 
|  | // Messages are 22 characters. | 
|  | return 22; | 
|  | } | 
|  |  | 
|  | int32_t TracePosix::AddDateTimeInfo(char* trace_message) const { | 
|  | time_t t; | 
|  | time(&t); | 
|  | char buffer[26];  // man ctime says buffer should have room for >=26 bytes. | 
|  | sprintf(trace_message, "Local Date: %s", ctime_r(&t, buffer)); | 
|  | int32_t len = static_cast<int32_t>(strlen(trace_message)); | 
|  |  | 
|  | if ('\n' == trace_message[len - 1]) { | 
|  | trace_message[len - 1] = '\0'; | 
|  | --len; | 
|  | } | 
|  |  | 
|  | // Messages is 12 characters. | 
|  | return len + 1; | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |