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
TracePosix()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
~TracePosix()29 TracePosix::~TracePosix() {
30 delete &crit_sect_;
31 }
32
AddTime(char * trace_message,const TraceLevel level) const33 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
AddDateTimeInfo(char * trace_message) const74 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