blob: c41159dae62632fac35e535f7260ead07cb5a5b0 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +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
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000011#include "webrtc/system_wrappers/source/trace_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000013#include <assert.h>
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000014#include <stdarg.h>
15#include <stdio.h>
16#include <string.h>
niklase@google.com470e71d2011-07-07 08:21:25 +000017
18#ifdef _WIN32
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000019#include "webrtc/system_wrappers/source/trace_win.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020#else
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000021#include "webrtc/system_wrappers/source/trace_posix.h"
22#endif // _WIN32
niklase@google.com470e71d2011-07-07 08:21:25 +000023
24#define KEY_LEN_CHARS 31
25
26#ifdef _WIN32
andrew@webrtc.org5dffebc2012-08-16 04:24:05 +000027#pragma warning(disable:4355)
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000028#endif // _WIN32
niklase@google.com470e71d2011-07-07 08:21:25 +000029
30namespace webrtc {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000031
andrew@webrtc.orgc1ffd332013-03-22 17:13:23 +000032const int Trace::kBoilerplateLength = 71;
33const int Trace::kTimestampPosition = 13;
34const int Trace::kTimestampLength = 12;
andrew@webrtc.org90805182013-09-05 16:40:43 +000035uint32_t Trace::level_filter_ = kTraceDefault;
niklase@google.com470e71d2011-07-07 08:21:25 +000036
37// Construct On First Use idiom. Avoids "static initialization order fiasco".
henrike@webrtc.org315282c2011-12-09 17:46:20 +000038TraceImpl* TraceImpl::StaticInstance(CountOperation count_operation,
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000039 const TraceLevel level) {
40 // Sanities to avoid taking lock unless absolutely necessary (for
41 // performance reasons). count_operation == kAddRefNoCreate implies that a
42 // message will be written to file.
43 if ((level != kTraceAll) && (count_operation == kAddRefNoCreate)) {
andrew@webrtc.org90805182013-09-05 16:40:43 +000044 if (!(level & level_filter())) {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000045 return NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +000046 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000047 }
48 TraceImpl* impl =
49 GetStaticInstance<TraceImpl>(count_operation);
50 return impl;
niklase@google.com470e71d2011-07-07 08:21:25 +000051}
52
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000053TraceImpl* TraceImpl::GetTrace(const TraceLevel level) {
54 return StaticInstance(kAddRefNoCreate, level);
niklase@google.com470e71d2011-07-07 08:21:25 +000055}
56
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000057TraceImpl* TraceImpl::CreateInstance() {
henrike@webrtc.org2f47b5a2011-12-10 00:44:47 +000058#if defined(_WIN32)
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000059 return new TraceWindows();
niklase@google.com470e71d2011-07-07 08:21:25 +000060#else
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000061 return new TracePosix();
niklase@google.com470e71d2011-07-07 08:21:25 +000062#endif
63}
64
65TraceImpl::TraceImpl()
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +000066 : callback_(NULL),
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000067 row_count_text_(0),
68 file_count_text_(0),
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +000069 trace_file_(FileWrapper::Create()) {
niklase@google.com470e71d2011-07-07 08:21:25 +000070}
71
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000072TraceImpl::~TraceImpl() {
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +000073 trace_file_->Flush();
74 trace_file_->CloseFile();
niklase@google.com470e71d2011-07-07 08:21:25 +000075}
76
pbos@webrtc.org046deb92013-04-09 09:06:11 +000077int32_t TraceImpl::AddThreadId(char* trace_message) const {
78 uint32_t thread_id = ThreadWrapper::GetThreadId();
pwestin@webrtc.orgb54d7272012-01-11 08:28:04 +000079 // Messages is 12 characters.
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000080 return sprintf(trace_message, "%10u; ", thread_id);
pwestin@webrtc.orgb54d7272012-01-11 08:28:04 +000081}
82
pbos@webrtc.org046deb92013-04-09 09:06:11 +000083int32_t TraceImpl::AddLevel(char* sz_message, const TraceLevel level) const {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +000084 const int kMessageLength = 12;
85 switch (level) {
86 case kTraceTerseInfo:
87 // Add the appropriate amount of whitespace.
88 memset(sz_message, ' ', kMessageLength);
89 sz_message[kMessageLength] = '\0';
90 break;
91 case kTraceStateInfo:
92 sprintf(sz_message, "STATEINFO ; ");
93 break;
94 case kTraceWarning:
95 sprintf(sz_message, "WARNING ; ");
96 break;
97 case kTraceError:
98 sprintf(sz_message, "ERROR ; ");
99 break;
100 case kTraceCritical:
101 sprintf(sz_message, "CRITICAL ; ");
102 break;
103 case kTraceInfo:
104 sprintf(sz_message, "DEBUGINFO ; ");
105 break;
106 case kTraceModuleCall:
107 sprintf(sz_message, "MODULECALL; ");
108 break;
109 case kTraceMemory:
110 sprintf(sz_message, "MEMORY ; ");
111 break;
112 case kTraceTimer:
113 sprintf(sz_message, "TIMER ; ");
114 break;
115 case kTraceStream:
116 sprintf(sz_message, "STREAM ; ");
117 break;
118 case kTraceApiCall:
119 sprintf(sz_message, "APICALL ; ");
120 break;
121 case kTraceDebug:
122 sprintf(sz_message, "DEBUG ; ");
123 break;
124 default:
125 assert(false);
126 return 0;
127 }
128 // All messages are 12 characters.
129 return kMessageLength;
niklase@google.com470e71d2011-07-07 08:21:25 +0000130}
131
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000132int32_t TraceImpl::AddModuleAndId(char* trace_message,
133 const TraceModule module,
134 const int32_t id) const {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000135 // Use long int to prevent problems with different definitions of
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000136 // int32_t.
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000137 // TODO(hellner): is this actually a problem? If so, it should be better to
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000138 // clean up int32_t
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000139 const long int idl = id;
140 const int kMessageLength = 25;
141 if (idl != -1) {
142 const unsigned long int id_engine = id >> 16;
143 const unsigned long int id_channel = id & 0xffff;
niklase@google.com470e71d2011-07-07 08:21:25 +0000144
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000145 switch (module) {
146 case kTraceUndefined:
147 // Add the appropriate amount of whitespace.
148 memset(trace_message, ' ', kMessageLength);
149 trace_message[kMessageLength] = '\0';
150 break;
151 case kTraceVoice:
152 sprintf(trace_message, " VOICE:%5ld %5ld;", id_engine,
153 id_channel);
154 break;
155 case kTraceVideo:
156 sprintf(trace_message, " VIDEO:%5ld %5ld;", id_engine,
157 id_channel);
158 break;
159 case kTraceUtility:
160 sprintf(trace_message, " UTILITY:%5ld %5ld;", id_engine,
161 id_channel);
162 break;
163 case kTraceRtpRtcp:
164 sprintf(trace_message, " RTP/RTCP:%5ld %5ld;", id_engine,
165 id_channel);
166 break;
167 case kTraceTransport:
168 sprintf(trace_message, " TRANSPORT:%5ld %5ld;", id_engine,
169 id_channel);
170 break;
171 case kTraceAudioCoding:
172 sprintf(trace_message, "AUDIO CODING:%5ld %5ld;", id_engine,
173 id_channel);
174 break;
175 case kTraceSrtp:
176 sprintf(trace_message, " SRTP:%5ld %5ld;", id_engine,
177 id_channel);
178 break;
179 case kTraceAudioMixerServer:
180 sprintf(trace_message, " AUDIO MIX/S:%5ld %5ld;", id_engine,
181 id_channel);
182 break;
183 case kTraceAudioMixerClient:
184 sprintf(trace_message, " AUDIO MIX/C:%5ld %5ld;", id_engine,
185 id_channel);
186 break;
187 case kTraceVideoCoding:
188 sprintf(trace_message, "VIDEO CODING:%5ld %5ld;", id_engine,
189 id_channel);
190 break;
191 case kTraceVideoMixer:
192 // Print sleep time and API call
193 sprintf(trace_message, " VIDEO MIX:%5ld %5ld;", id_engine,
194 id_channel);
195 break;
196 case kTraceFile:
197 sprintf(trace_message, " FILE:%5ld %5ld;", id_engine,
198 id_channel);
199 break;
200 case kTraceAudioProcessing:
201 sprintf(trace_message, " AUDIO PROC:%5ld %5ld;", id_engine,
202 id_channel);
203 break;
204 case kTraceAudioDevice:
205 sprintf(trace_message, "AUDIO DEVICE:%5ld %5ld;", id_engine,
206 id_channel);
207 break;
208 case kTraceVideoRenderer:
209 sprintf(trace_message, "VIDEO RENDER:%5ld %5ld;", id_engine,
210 id_channel);
211 break;
212 case kTraceVideoCapture:
213 sprintf(trace_message, "VIDEO CAPTUR:%5ld %5ld;", id_engine,
214 id_channel);
215 break;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000216 case kTraceRemoteBitrateEstimator:
217 sprintf(trace_message, " BWE RBE:%5ld %5ld;", id_engine,
218 id_channel);
219 break;
niklase@google.com470e71d2011-07-07 08:21:25 +0000220 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000221 } else {
222 switch (module) {
223 case kTraceUndefined:
224 // Add the appropriate amount of whitespace.
225 memset(trace_message, ' ', kMessageLength);
226 trace_message[kMessageLength] = '\0';
227 break;
228 case kTraceVoice:
229 sprintf(trace_message, " VOICE:%11ld;", idl);
230 break;
231 case kTraceVideo:
232 sprintf(trace_message, " VIDEO:%11ld;", idl);
233 break;
234 case kTraceUtility:
235 sprintf(trace_message, " UTILITY:%11ld;", idl);
236 break;
237 case kTraceRtpRtcp:
238 sprintf(trace_message, " RTP/RTCP:%11ld;", idl);
239 break;
240 case kTraceTransport:
241 sprintf(trace_message, " TRANSPORT:%11ld;", idl);
242 break;
243 case kTraceAudioCoding:
244 sprintf(trace_message, "AUDIO CODING:%11ld;", idl);
245 break;
246 case kTraceSrtp:
247 sprintf(trace_message, " SRTP:%11ld;", idl);
248 break;
249 case kTraceAudioMixerServer:
250 sprintf(trace_message, " AUDIO MIX/S:%11ld;", idl);
251 break;
252 case kTraceAudioMixerClient:
253 sprintf(trace_message, " AUDIO MIX/C:%11ld;", idl);
254 break;
255 case kTraceVideoCoding:
256 sprintf(trace_message, "VIDEO CODING:%11ld;", idl);
257 break;
258 case kTraceVideoMixer:
259 sprintf(trace_message, " VIDEO MIX:%11ld;", idl);
260 break;
261 case kTraceFile:
262 sprintf(trace_message, " FILE:%11ld;", idl);
263 break;
264 case kTraceAudioProcessing:
265 sprintf(trace_message, " AUDIO PROC:%11ld;", idl);
266 break;
267 case kTraceAudioDevice:
268 sprintf(trace_message, "AUDIO DEVICE:%11ld;", idl);
269 break;
270 case kTraceVideoRenderer:
271 sprintf(trace_message, "VIDEO RENDER:%11ld;", idl);
272 break;
273 case kTraceVideoCapture:
274 sprintf(trace_message, "VIDEO CAPTUR:%11ld;", idl);
275 break;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000276 case kTraceRemoteBitrateEstimator:
277 sprintf(trace_message, " BWE RBE:%11ld;", idl);
278 break;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000279 }
280 }
281 return kMessageLength;
niklase@google.com470e71d2011-07-07 08:21:25 +0000282}
283
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000284int32_t TraceImpl::SetTraceFileImpl(const char* file_name_utf8,
285 const bool add_file_counter) {
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000286 rtc::CritScope lock(&crit_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000287
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000288 trace_file_->Flush();
289 trace_file_->CloseFile();
niklase@google.com470e71d2011-07-07 08:21:25 +0000290
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000291 if (file_name_utf8) {
292 if (add_file_counter) {
293 file_count_text_ = 1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000294
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000295 char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize];
296 CreateFileName(file_name_utf8, file_name_with_counter_utf8,
297 file_count_text_);
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000298 if (trace_file_->OpenFile(file_name_with_counter_utf8, false, false,
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000299 true) == -1) {
300 return -1;
301 }
302 } else {
303 file_count_text_ = 0;
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000304 if (trace_file_->OpenFile(file_name_utf8, false, false, true) == -1) {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000305 return -1;
306 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000307 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000308 }
309 row_count_text_ = 0;
310 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000311}
312
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000313int32_t TraceImpl::TraceFileImpl(
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000314 char file_name_utf8[FileWrapper::kMaxFileNameSize]) {
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000315 rtc::CritScope lock(&crit_);
316 return trace_file_->FileName(file_name_utf8, FileWrapper::kMaxFileNameSize);
niklase@google.com470e71d2011-07-07 08:21:25 +0000317}
318
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000319int32_t TraceImpl::SetTraceCallbackImpl(TraceCallback* callback) {
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000320 rtc::CritScope lock(&crit_);
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000321 callback_ = callback;
322 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000323}
324
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000325int32_t TraceImpl::AddMessage(
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000326 char* trace_message,
niklase@google.com470e71d2011-07-07 08:21:25 +0000327 const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000328 const uint16_t written_so_far) const {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000329 int length = 0;
330 if (written_so_far >= WEBRTC_TRACE_MAX_MESSAGE_SIZE) {
331 return -1;
332 }
333 // - 2 to leave room for newline and NULL termination.
niklase@google.com470e71d2011-07-07 08:21:25 +0000334#ifdef _WIN32
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000335 length = _snprintf(trace_message,
336 WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2,
337 "%s", msg);
338 if (length < 0) {
339 length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2;
340 trace_message[length] = 0;
341 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000342#else
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000343 length = snprintf(trace_message,
344 WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2,
345 "%s", msg);
346 if (length < 0 ||
347 length > WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2) {
348 length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2;
349 trace_message[length] = 0;
350 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000351#endif
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000352 // Length with NULL termination.
353 return length + 1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000354}
355
356void TraceImpl::AddMessageToList(
andrew@webrtc.orgc1ffd332013-03-22 17:13:23 +0000357 const char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000358 const uint16_t length,
andrew@webrtc.orgc1ffd332013-03-22 17:13:23 +0000359 const TraceLevel level) {
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000360 rtc::CritScope lock(&crit_);
361 if (callback_)
solenberg@webrtc.orgadb51f52013-06-10 09:03:41 +0000362 callback_->Print(level, trace_message, length);
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000363 WriteToFile(trace_message, length);
niklase@google.com470e71d2011-07-07 08:21:25 +0000364}
365
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000366void TraceImpl::WriteToFile(const char* msg, uint16_t length) {
367 if (!trace_file_->Open())
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000368 return;
niklase@google.com470e71d2011-07-07 08:21:25 +0000369
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000370 if (row_count_text_ > WEBRTC_TRACE_MAX_FILE_SIZE) {
371 // wrap file
372 row_count_text_ = 0;
373 trace_file_->Flush();
niklase@google.com470e71d2011-07-07 08:21:25 +0000374
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000375 if (file_count_text_ == 0) {
376 trace_file_->Rewind();
377 } else {
378 char old_file_name[FileWrapper::kMaxFileNameSize];
379 char new_file_name[FileWrapper::kMaxFileNameSize];
380
381 // get current name
382 trace_file_->FileName(old_file_name, FileWrapper::kMaxFileNameSize);
383 trace_file_->CloseFile();
384
385 file_count_text_++;
386
387 UpdateFileName(old_file_name, new_file_name, file_count_text_);
388
389 if (trace_file_->OpenFile(new_file_name, false, false, true) == -1) {
390 return;
391 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000392 }
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000393 }
394 if (row_count_text_ == 0) {
395 char message[WEBRTC_TRACE_MAX_MESSAGE_SIZE + 1];
396 int32_t length = AddDateTimeInfo(message);
397 if (length != -1) {
398 message[length] = 0;
399 message[length - 1] = '\n';
400 trace_file_->Write(message, length);
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000401 row_count_text_++;
402 }
403 }
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000404 trace_file_->Write(msg, length);
405 row_count_text_++;
niklase@google.com470e71d2011-07-07 08:21:25 +0000406}
407
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000408void TraceImpl::AddImpl(const TraceLevel level,
409 const TraceModule module,
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000410 const int32_t id,
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000411 const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE]) {
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000412 if (!TraceCheck(level))
413 return;
niklase@google.com470e71d2011-07-07 08:21:25 +0000414
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000415 char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
416 char* message_ptr = &trace_message[0];
417 int32_t len = AddLevel(message_ptr, level);
418 if (len == -1)
419 return;
niklase@google.com470e71d2011-07-07 08:21:25 +0000420
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000421 message_ptr += len;
422 int32_t ack_len = len;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000423
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000424 len = AddTime(message_ptr, level);
425 if (len == -1)
426 return;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000427
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000428 message_ptr += len;
429 ack_len += len;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000430
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000431 len = AddModuleAndId(message_ptr, module, id);
432 if (len == -1)
433 return;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000434
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000435 message_ptr += len;
436 ack_len += len;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000437
pbos@webrtc.org4b3618c2015-02-27 15:05:03 +0000438 len = AddThreadId(message_ptr);
439 if (len < 0)
440 return;
441
442 message_ptr += len;
443 ack_len += len;
444
445 len = AddMessage(message_ptr, msg, static_cast<uint16_t>(ack_len));
446 if (len == -1)
447 return;
448
449 ack_len += len;
450 AddMessageToList(trace_message, static_cast<uint16_t>(ack_len), level);
niklase@google.com470e71d2011-07-07 08:21:25 +0000451}
452
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000453bool TraceImpl::TraceCheck(const TraceLevel level) const {
andrew@webrtc.org90805182013-09-05 16:40:43 +0000454 return (level & level_filter()) ? true : false;
niklase@google.com470e71d2011-07-07 08:21:25 +0000455}
456
457bool TraceImpl::UpdateFileName(
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000458 const char file_name_utf8[FileWrapper::kMaxFileNameSize],
459 char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize],
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000460 const uint32_t new_count) const {
461 int32_t length = (int32_t)strlen(file_name_utf8);
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000462 if (length < 0) {
463 return false;
464 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000465
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000466 int32_t length_without_file_ending = length - 1;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000467 while (length_without_file_ending > 0) {
468 if (file_name_utf8[length_without_file_ending] == '.') {
469 break;
470 } else {
471 length_without_file_ending--;
niklase@google.com470e71d2011-07-07 08:21:25 +0000472 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000473 }
474 if (length_without_file_ending == 0) {
475 length_without_file_ending = length;
476 }
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000477 int32_t length_to_ = length_without_file_ending - 1;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000478 while (length_to_ > 0) {
479 if (file_name_utf8[length_to_] == '_') {
480 break;
481 } else {
482 length_to_--;
niklase@google.com470e71d2011-07-07 08:21:25 +0000483 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000484 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000485
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000486 memcpy(file_name_with_counter_utf8, file_name_utf8, length_to_);
487 sprintf(file_name_with_counter_utf8 + length_to_, "_%lu%s",
488 static_cast<long unsigned int>(new_count),
489 file_name_utf8 + length_without_file_ending);
490 return true;
niklase@google.com470e71d2011-07-07 08:21:25 +0000491}
492
493bool TraceImpl::CreateFileName(
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000494 const char file_name_utf8[FileWrapper::kMaxFileNameSize],
495 char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize],
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000496 const uint32_t new_count) const {
497 int32_t length = (int32_t)strlen(file_name_utf8);
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000498 if (length < 0) {
499 return false;
500 }
501
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000502 int32_t length_without_file_ending = length - 1;
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000503 while (length_without_file_ending > 0) {
504 if (file_name_utf8[length_without_file_ending] == '.') {
505 break;
506 } else {
507 length_without_file_ending--;
niklase@google.com470e71d2011-07-07 08:21:25 +0000508 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000509 }
510 if (length_without_file_ending == 0) {
511 length_without_file_ending = length;
512 }
513 memcpy(file_name_with_counter_utf8, file_name_utf8,
514 length_without_file_ending);
515 sprintf(file_name_with_counter_utf8 + length_without_file_ending, "_%lu%s",
516 static_cast<long unsigned int>(new_count),
517 file_name_utf8 + length_without_file_ending);
518 return true;
niklase@google.com470e71d2011-07-07 08:21:25 +0000519}
520
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000521void Trace::CreateTrace() {
522 TraceImpl::StaticInstance(kAddRef);
tommi@webrtc.orgcde1e7f2011-11-15 12:23:36 +0000523}
524
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000525void Trace::ReturnTrace() {
526 TraceImpl::StaticInstance(kRelease);
tommi@webrtc.orgcde1e7f2011-11-15 12:23:36 +0000527}
528
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000529int32_t Trace::TraceFile(char file_name[FileWrapper::kMaxFileNameSize]) {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000530 TraceImpl* trace = TraceImpl::GetTrace();
531 if (trace) {
532 int ret_val = trace->TraceFileImpl(file_name);
533 ReturnTrace();
534 return ret_val;
535 }
536 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000537}
538
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000539int32_t Trace::SetTraceFile(const char* file_name,
540 const bool add_file_counter) {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000541 TraceImpl* trace = TraceImpl::GetTrace();
542 if (trace) {
543 int ret_val = trace->SetTraceFileImpl(file_name, add_file_counter);
544 ReturnTrace();
545 return ret_val;
546 }
547 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000548}
549
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000550int32_t Trace::SetTraceCallback(TraceCallback* callback) {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000551 TraceImpl* trace = TraceImpl::GetTrace();
552 if (trace) {
553 int ret_val = trace->SetTraceCallbackImpl(callback);
554 ReturnTrace();
555 return ret_val;
556 }
557 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000558}
559
560void Trace::Add(const TraceLevel level, const TraceModule module,
pbos@webrtc.org046deb92013-04-09 09:06:11 +0000561 const int32_t id, const char* msg, ...) {
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000562 TraceImpl* trace = TraceImpl::GetTrace(level);
563 if (trace) {
564 if (trace->TraceCheck(level)) {
565 char temp_buff[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
566 char* buff = 0;
567 if (msg) {
568 va_list args;
569 va_start(args, msg);
niklase@google.com470e71d2011-07-07 08:21:25 +0000570#ifdef _WIN32
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000571 _vsnprintf(temp_buff, WEBRTC_TRACE_MAX_MESSAGE_SIZE - 1, msg, args);
niklase@google.com470e71d2011-07-07 08:21:25 +0000572#else
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000573 vsnprintf(temp_buff, WEBRTC_TRACE_MAX_MESSAGE_SIZE - 1, msg, args);
niklase@google.com470e71d2011-07-07 08:21:25 +0000574#endif
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000575 va_end(args);
576 buff = temp_buff;
577 }
578 trace->AddImpl(level, module, id, buff);
niklase@google.com470e71d2011-07-07 08:21:25 +0000579 }
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000580 ReturnTrace();
581 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000582}
tommi@webrtc.orgcde1e7f2011-11-15 12:23:36 +0000583
phoglund@webrtc.orgdaabfd22013-01-03 09:37:03 +0000584} // namespace webrtc