1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/system_wrappers/source/trace_posix.h" 12 13 #include <assert.h> 14 #include <stdarg.h> 15 #include <stdio.h> 16 #include <string.h> 17 #include <sys/time.h> 18 #include <time.h> 19 20 namespace webrtc { 21 22 TracePosix::TracePosix() 23 : crit_sect_(*CriticalSectionWrapper::CreateCriticalSection()) { 24 struct timeval system_time_high_res; 25 gettimeofday(&system_time_high_res, 0); 26 prev_api_tick_count_ = prev_tick_count_ = system_time_high_res.tv_sec; 27 } 28 29 TracePosix::~TracePosix() { 30 delete &crit_sect_; 31 } 32 33 int32_t TracePosix::AddTime(char* trace_message, const TraceLevel level) const { 34 struct timeval system_time_high_res; 35 if (gettimeofday(&system_time_high_res, 0) == -1) { 36 return -1; 37 } 38 struct tm buffer; 39 const struct tm* system_time = 40 localtime_r(&system_time_high_res.tv_sec, &buffer); 41 42 const uint32_t ms_time = system_time_high_res.tv_usec / 1000; 43 uint32_t prev_tickCount = 0; 44 { 45 CriticalSectionScoped lock(&crit_sect_); 46 if (level == kTraceApiCall) { 47 prev_tickCount = prev_tick_count_; 48 prev_tick_count_ = ms_time; 49 } else { 50 prev_tickCount = prev_api_tick_count_; 51 prev_api_tick_count_ = ms_time; 52 } 53 } 54 55 uint32_t dw_delta_time = ms_time - prev_tickCount; 56 if (prev_tickCount == 0) { 57 dw_delta_time = 0; 58 } 59 if (dw_delta_time > 0x0fffffff) { 60 // Either wraparound or data race. 61 dw_delta_time = 0; 62 } 63 if (dw_delta_time > 99999) { 64 dw_delta_time = 99999; 65 } 66 67 sprintf(trace_message, "(%2u:%2u:%2u:%3u |%5lu) ", system_time->tm_hour, 68 system_time->tm_min, system_time->tm_sec, ms_time, 69 static_cast<unsigned long>(dw_delta_time)); 70 // Messages are 22 characters. 71 return 22; 72 } 73 74 int32_t TracePosix::AddDateTimeInfo(char* trace_message) const { 75 time_t t; 76 time(&t); 77 char buffer[26]; // man ctime says buffer should have room for >=26 bytes. 78 sprintf(trace_message, "Local Date: %s", ctime_r(&t, buffer)); 79 int32_t len = static_cast<int32_t>(strlen(trace_message)); 80 81 if ('\n' == trace_message[len - 1]) { 82 trace_message[len - 1] = '\0'; 83 --len; 84 } 85 86 // Messages is 12 characters. 87 return len + 1; 88 } 89 90 } // namespace webrtc 91