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 #if defined(_DEBUG) 21 #define BUILDMODE "d" 22 #elif defined(DEBUG) 23 #define BUILDMODE "d" 24 #elif defined(NDEBUG) 25 #define BUILDMODE "r" 26 #else 27 #define BUILDMODE "?" 28 #endif 29 #define BUILDTIME __TIME__ 30 #define BUILDDATE __DATE__ 31 // example: "Oct 10 2002 12:05:30 r" 32 #define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE 33 34 namespace webrtc { 35 36 TracePosix::TracePosix() 37 : crit_sect_(*CriticalSectionWrapper::CreateCriticalSection()) { 38 struct timeval system_time_high_res; 39 gettimeofday(&system_time_high_res, 0); 40 prev_api_tick_count_ = prev_tick_count_ = system_time_high_res.tv_sec; 41 } 42 43 TracePosix::~TracePosix() { 44 delete &crit_sect_; 45 StopThread(); 46 } 47 48 int32_t TracePosix::AddTime(char* trace_message, const TraceLevel level) const { 49 struct timeval system_time_high_res; 50 if (gettimeofday(&system_time_high_res, 0) == -1) { 51 return -1; 52 } 53 struct tm buffer; 54 const struct tm* system_time = 55 localtime_r(&system_time_high_res.tv_sec, &buffer); 56 57 const uint32_t ms_time = system_time_high_res.tv_usec / 1000; 58 uint32_t prev_tickCount = 0; 59 { 60 CriticalSectionScoped lock(&crit_sect_); 61 if (level == kTraceApiCall) { 62 prev_tickCount = prev_tick_count_; 63 prev_tick_count_ = ms_time; 64 } else { 65 prev_tickCount = prev_api_tick_count_; 66 prev_api_tick_count_ = ms_time; 67 } 68 } 69 70 uint32_t dw_delta_time = ms_time - prev_tickCount; 71 if (prev_tickCount == 0) { 72 dw_delta_time = 0; 73 } 74 if (dw_delta_time > 0x0fffffff) { 75 // Either wraparound or data race. 76 dw_delta_time = 0; 77 } 78 if (dw_delta_time > 99999) { 79 dw_delta_time = 99999; 80 } 81 82 sprintf(trace_message, "(%2u:%2u:%2u:%3u |%5lu) ", system_time->tm_hour, 83 system_time->tm_min, system_time->tm_sec, ms_time, 84 static_cast<unsigned long>(dw_delta_time)); 85 // Messages are 22 characters. 86 return 22; 87 } 88 89 int32_t TracePosix::AddBuildInfo(char* trace_message) const { 90 sprintf(trace_message, "Build info: %s", BUILDINFO); 91 // Include NULL termination (hence + 1). 92 return strlen(trace_message) + 1; 93 } 94 95 int32_t TracePosix::AddDateTimeInfo(char* trace_message) const { 96 time_t t; 97 time(&t); 98 char buffer[26]; // man ctime says buffer should have room for >=26 bytes. 99 sprintf(trace_message, "Local Date: %s", ctime_r(&t, buffer)); 100 int32_t len = static_cast<int32_t>(strlen(trace_message)); 101 102 if ('\n' == trace_message[len - 1]) { 103 trace_message[len - 1] = '\0'; 104 --len; 105 } 106 107 // Messages is 12 characters. 108 return len + 1; 109 } 110 111 } // namespace webrtc 112