• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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