1/* 2 * Copyright (c) 2011 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 "trace_posix.h" 12 13#include <cassert> 14#include <stdarg.h> 15#include <stdio.h> 16#include <string.h> 17#include <time.h> 18#ifdef __linux__ 19 #include <sys/syscall.h> 20#endif 21#ifdef WEBRTC_ANDROID 22 #include <pthread.h> 23#else 24 #include <iostream> 25#endif 26 27#if defined(_DEBUG) 28 #define BUILDMODE "d" 29#elif defined(DEBUG) 30 #define BUILDMODE "d" 31#elif defined(NDEBUG) 32 #define BUILDMODE "r" 33#else 34 #define BUILDMODE "?" 35#endif 36#define BUILDTIME __TIME__ 37#define BUILDDATE __DATE__ 38// example: "Oct 10 2002 12:05:30 r" 39#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE 40 41namespace webrtc { 42TracePosix::TracePosix() 43{ 44 _prevAPITickCount = time(NULL); 45 _prevTickCount = _prevAPITickCount; 46} 47 48TracePosix::~TracePosix() 49{ 50 StopThread(); 51} 52 53WebRtc_Word32 TracePosix::AddThreadId(char* traceMessage) const { 54#ifdef __linux__ 55 pid_t threadId = (pid_t) syscall(__NR_gettid); 56 sprintf(traceMessage, "%10d; ", threadId); 57#else 58 WebRtc_UWord64 threadId = (WebRtc_UWord64)pthread_self(); 59 sprintf(traceMessage, "%10llu; ", 60 static_cast<long long unsigned int>(threadId)); 61#endif 62 // 12 bytes are written. 63 return 12; 64} 65 66WebRtc_Word32 TracePosix::AddTime(char* traceMessage, 67 const TraceLevel level) const 68{ 69 time_t dwCurrentTimeInSeconds = time(NULL); 70 struct tm systemTime; 71 gmtime_r(&dwCurrentTimeInSeconds, &systemTime); 72 73 if(level == kTraceApiCall) 74 { 75 WebRtc_UWord32 dwDeltaTime = dwCurrentTimeInSeconds - _prevTickCount; 76 _prevTickCount = dwCurrentTimeInSeconds; 77 78 if(_prevTickCount == 0) 79 { 80 dwDeltaTime = 0; 81 } 82 if(dwDeltaTime > 0x0fffffff) 83 { 84 // Either wraparound or data race. 85 dwDeltaTime = 0; 86 } 87 if(dwDeltaTime > 99999) 88 { 89 dwDeltaTime = 99999; 90 } 91 92 sprintf(traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.tm_hour, 93 systemTime.tm_min, systemTime.tm_sec, 0, 94 static_cast<unsigned long>(dwDeltaTime)); 95 } else { 96 WebRtc_UWord32 dwDeltaTime = dwCurrentTimeInSeconds - _prevAPITickCount; 97 _prevAPITickCount = dwCurrentTimeInSeconds; 98 if(_prevAPITickCount == 0) 99 { 100 dwDeltaTime = 0; 101 } 102 if(dwDeltaTime > 0x0fffffff) 103 { 104 // Either wraparound or data race. 105 dwDeltaTime = 0; 106 } 107 if(dwDeltaTime > 99999) 108 { 109 dwDeltaTime = 99999; 110 } 111 sprintf(traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.tm_hour, 112 systemTime.tm_min, systemTime.tm_sec, 0, 113 static_cast<unsigned long>(dwDeltaTime)); 114 } 115 // Messages is 22 characters. 116 return 22; 117} 118 119WebRtc_Word32 TracePosix::AddBuildInfo(char* traceMessage) const 120{ 121 sprintf(traceMessage, "Build info: %s", BUILDINFO); 122 // Include NULL termination (hence + 1). 123 return strlen(traceMessage) + 1; 124} 125 126WebRtc_Word32 TracePosix::AddDateTimeInfo(char* traceMessage) const 127{ 128 time_t t; 129 time(&t); 130 sprintf(traceMessage, "Local Date: %s", ctime(&t)); 131 WebRtc_Word32 len = static_cast<WebRtc_Word32>(strlen(traceMessage)); 132 133 if ('\n' == traceMessage[len - 1]) 134 { 135 traceMessage[len - 1] = '\0'; 136 --len; 137 } 138 139 // Messages is 12 characters. 140 return len + 1; 141} 142} // namespace webrtc 143