blob: 1b8dd934d2f1dfa429c635b86c31a98362f0a02f [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
ajm@google.comb5c49ff2011-08-01 17:04:04 +000011#include "trace_posix.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
13#include <cassert>
14#include <stdarg.h>
15#include <stdio.h>
16#include <string.h>
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +000017#include <sys/time.h>
niklase@google.com470e71d2011-07-07 08:21:25 +000018#include <time.h>
leozwang@google.comb3527002011-07-26 17:29:38 +000019#ifdef WEBRTC_ANDROID
niklase@google.com470e71d2011-07-07 08:21:25 +000020 #include <pthread.h>
21#else
22 #include <iostream>
23#endif
24
25#if defined(_DEBUG)
26 #define BUILDMODE "d"
27#elif defined(DEBUG)
28 #define BUILDMODE "d"
29#elif defined(NDEBUG)
30 #define BUILDMODE "r"
31#else
32 #define BUILDMODE "?"
33#endif
34#define BUILDTIME __TIME__
35#define BUILDDATE __DATE__
36// example: "Oct 10 2002 12:05:30 r"
37#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
38
39namespace webrtc {
ajm@google.comb5c49ff2011-08-01 17:04:04 +000040TracePosix::TracePosix()
niklase@google.com470e71d2011-07-07 08:21:25 +000041{
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +000042 struct timeval systemTimeHighRes;
43 gettimeofday(&systemTimeHighRes, 0);
44 _prevAPITickCount = _prevTickCount = systemTimeHighRes.tv_sec;
niklase@google.com470e71d2011-07-07 08:21:25 +000045}
46
ajm@google.comb5c49ff2011-08-01 17:04:04 +000047TracePosix::~TracePosix()
niklase@google.com470e71d2011-07-07 08:21:25 +000048{
49 StopThread();
50}
51
ajm@google.comb5c49ff2011-08-01 17:04:04 +000052WebRtc_Word32 TracePosix::AddTime(char* traceMessage,
niklase@google.com470e71d2011-07-07 08:21:25 +000053 const TraceLevel level) const
54{
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +000055 struct timeval systemTimeHighRes;
56 if (gettimeofday(&systemTimeHighRes, 0) == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +000057 {
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +000058 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +000059 }
hta@webrtc.org1484ac02012-05-23 15:39:17 +000060 struct tm buffer;
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +000061 const struct tm* systemTime =
hta@webrtc.org1484ac02012-05-23 15:39:17 +000062 localtime_r(&systemTimeHighRes.tv_sec, &buffer);
henrike@webrtc.org0e7c0602012-02-08 18:53:50 +000063
64 const WebRtc_UWord32 ms_time = systemTimeHighRes.tv_usec / 1000;
65 WebRtc_UWord32 prevTickCount = 0;
66 if (level == kTraceApiCall)
67 {
68 prevTickCount = _prevTickCount;
69 _prevTickCount = ms_time;
70 } else {
71 prevTickCount = _prevAPITickCount;
72 _prevAPITickCount = ms_time;
73 }
74 WebRtc_UWord32 dwDeltaTime = ms_time - prevTickCount;
75 if (prevTickCount == 0)
76 {
77 dwDeltaTime = 0;
78 }
79 if (dwDeltaTime > 0x0fffffff)
80 {
81 // Either wraparound or data race.
82 dwDeltaTime = 0;
83 }
84 if(dwDeltaTime > 99999)
85 {
86 dwDeltaTime = 99999;
87 }
88
89 sprintf(traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime->tm_hour,
90 systemTime->tm_min, systemTime->tm_sec, ms_time,
91 static_cast<unsigned long>(dwDeltaTime));
92 // Messages are 22 characters.
niklase@google.com470e71d2011-07-07 08:21:25 +000093 return 22;
94}
95
ajm@google.comb5c49ff2011-08-01 17:04:04 +000096WebRtc_Word32 TracePosix::AddBuildInfo(char* traceMessage) const
niklase@google.com470e71d2011-07-07 08:21:25 +000097{
98 sprintf(traceMessage, "Build info: %s", BUILDINFO);
99 // Include NULL termination (hence + 1).
100 return strlen(traceMessage) + 1;
101}
102
ajm@google.comb5c49ff2011-08-01 17:04:04 +0000103WebRtc_Word32 TracePosix::AddDateTimeInfo(char* traceMessage) const
niklase@google.com470e71d2011-07-07 08:21:25 +0000104{
105 time_t t;
106 time(&t);
hta@webrtc.org1484ac02012-05-23 15:39:17 +0000107 char buffer[26]; // man ctime says buffer should have room for >=26 bytes.
108 sprintf(traceMessage, "Local Date: %s", ctime_r(&t, buffer));
niklase@google.com470e71d2011-07-07 08:21:25 +0000109 WebRtc_Word32 len = static_cast<WebRtc_Word32>(strlen(traceMessage));
110
111 if ('\n' == traceMessage[len - 1])
112 {
113 traceMessage[len - 1] = '\0';
114 --len;
115 }
116
117 // Messages is 12 characters.
118 return len + 1;
119}
120} // namespace webrtc