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