trace_impl.cc revision c55a96383497a772a307b346368133960b02ad03
1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Use of this source code is governed by a BSD-style license 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * that can be found in the LICENSE file in the root of the source 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * tree. An additional intellectual property rights grant can be found 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * in the file PATENTS. All contributing project authors may 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * be found in the AUTHORS file in the root of the source tree. 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "trace_impl.h" 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <cassert> 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <string.h> // memset 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32 17c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "trace_win.h" 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <stdio.h> 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <time.h> 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <stdarg.h> 22c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "trace_posix.h" 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // _WIN32 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define KEY_LEN_CHARS 31 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent #pragma warning(disable:4355) 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// VS 2005: Disable warnings for default initialized arrays. 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent #pragma warning(disable:4351) 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // _WIN32 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc { 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstatic WebRtc_UWord32 levelFilter = kTraceDefault; 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Construct On First Use idiom. Avoids "static initialization order fiasco". 37c55a96383497a772a307b346368133960b02ad03Eric LaurentTraceImpl* TraceImpl::StaticInstance(CountOperation count_operation, 38c55a96383497a772a307b346368133960b02ad03Eric Laurent const TraceLevel level) 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 40c55a96383497a772a307b346368133960b02ad03Eric Laurent // Sanities to avoid taking lock unless absolutely necessary (for 41c55a96383497a772a307b346368133960b02ad03Eric Laurent // performance reasons). 42c55a96383497a772a307b346368133960b02ad03Eric Laurent // count_operation == kAddRefNoCreate implies that a message will be 43c55a96383497a772a307b346368133960b02ad03Eric Laurent // written to file. 44c55a96383497a772a307b346368133960b02ad03Eric Laurent if((level != kTraceAll) && (count_operation == kAddRefNoCreate)) 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(!(level & levelFilter)) 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 51c55a96383497a772a307b346368133960b02ad03Eric Laurent TraceImpl* impl = 52c55a96383497a772a307b346368133960b02ad03Eric Laurent GetStaticInstance<TraceImpl>(count_operation); 53c55a96383497a772a307b346368133960b02ad03Eric Laurent return impl; 54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTraceImpl* TraceImpl::GetTrace(const TraceLevel level) 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 58c55a96383497a772a307b346368133960b02ad03Eric Laurent return StaticInstance(kAddRefNoCreate, level); 59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 61c55a96383497a772a307b346368133960b02ad03Eric LaurentTraceImpl* TraceImpl::CreateInstance() 62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#if defined(_WIN32) 64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return new TraceWindows(); 65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else 66c55a96383497a772a307b346368133960b02ad03Eric Laurent return new TracePosix(); 67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTraceImpl::TraceImpl() 71c55a96383497a772a307b346368133960b02ad03Eric Laurent : _critsectInterface(CriticalSectionWrapper::CreateCriticalSection()), 72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _callback(NULL), 73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText(0), 74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _fileCountText(0), 75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile(*FileWrapper::Create()), 76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _thread(*ThreadWrapper::CreateThread(TraceImpl::Run, this, 77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kHighestPriority, "Trace")), 78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _event(*EventWrapper::Create()), 79c55a96383497a772a307b346368133960b02ad03Eric Laurent _critsectArray(CriticalSectionWrapper::CreateCriticalSection()), 80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx(), 81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _level(), 82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _length(), 83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _messageQueue(), 84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _activeQueue(0) 85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx[0] = 0; 87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx[1] = 0; 88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int tid = 0; 90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _thread.Start(tid); 91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(int m = 0; m < WEBRTC_TRACE_NUM_ARRAY; m++) 93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(int n = 0; n < WEBRTC_TRACE_MAX_QUEUE; n++) 95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _messageQueue[m][n] = new 97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8[WEBRTC_TRACE_MAX_MESSAGE_SIZE]; 98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool TraceImpl::StopThread() 103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Release the worker thread so that it can flush any lingering messages. 105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _event.Set(); 106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Allow 10 ms for pending messages to be flushed out. 108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // TODO (hellner): why not use condition variables to do this? Or let the 109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // worker thread die and let this thread flush remaining 110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // messages? 111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32 112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent Sleep(10); 113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else 114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent timespec t; 115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent t.tv_sec = 0; 116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent t.tv_nsec = 10*1000000; 117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent nanosleep(&t,NULL); 118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _thread.SetNotAlive(); 121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Make sure the thread finishes as quickly as possible (instead of having 122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // to wait for the timeout). 123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _event.Set(); 124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool stopped = _thread.Stop(); 125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectInterface); 127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Flush(); 128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.CloseFile(); 129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return stopped; 130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTraceImpl::~TraceImpl() 133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent StopThread(); 135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete &_event; 136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete &_traceFile; 137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete &_thread; 138c55a96383497a772a307b346368133960b02ad03Eric Laurent delete _critsectInterface; 139c55a96383497a772a307b346368133960b02ad03Eric Laurent delete _critsectArray; 140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(int m = 0; m < WEBRTC_TRACE_NUM_ARRAY; m++) 142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(int n = 0; n < WEBRTC_TRACE_MAX_QUEUE; n++) 144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] _messageQueue[m][n]; 146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 TraceImpl::AddLevel(char* szMessage, const TraceLevel level) const 151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent switch (level) 153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceStateInfo: 155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "STATEINFO ; "); 156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceWarning: 158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "WARNING ; "); 159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceError: 161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "ERROR ; "); 162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceCritical: 164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "CRITICAL ; "); 165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceInfo: 167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "DEBUGINFO ; "); 168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceModuleCall: 170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "MODULECALL; "); 171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceMemory: 173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "MEMORY ; "); 174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceTimer: 176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "TIMER ; "); 177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceStream: 179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "STREAM ; "); 180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceApiCall: 182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "APICALL ; "); 183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceDebug: 185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (szMessage, "DEBUG ; "); 186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent default: 188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert(false); 189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // All messages are 12 characters. 192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 12; 193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 TraceImpl::AddModuleAndId(char* traceMessage, 196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const TraceModule module, 197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id) const 198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Use long int to prevent problems with different definitions of 200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // WebRtc_Word32. 201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // TODO (hellner): is this actually a problem? If so, it should be better to 202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // clean up WebRtc_Word32 203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const long int idl = id; 204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(idl != -1) 205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const unsigned long int idEngine = id>>16; 207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const unsigned long int idChannel = id & 0xffff; 208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent switch (module) 210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVoice: 212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " VOICE:%5ld %5ld;", idEngine, 213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideo: 216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " VIDEO:%5ld %5ld;", idEngine, 217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 218e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 219e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceUtility: 220e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " UTILITY:%5ld %5ld;", idEngine, 221e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceRtpRtcp: 224e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " RTP/RTCP:%5ld %5ld;", idEngine, 225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 226e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceTransport: 228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " TRANSPORT:%5ld %5ld;", idEngine, 229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioCoding: 232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, "AUDIO CODING:%5ld %5ld;", idEngine, 233e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 235e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceSrtp: 236e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " SRTP:%5ld %5ld;", idEngine, 237e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 238e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 239e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioMixerServer: 240e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " AUDIO MIX/S:%5ld %5ld;", idEngine, 241e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 242e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 243e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioMixerClient: 244e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " AUDIO MIX/C:%5ld %5ld;", idEngine, 245e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 246e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 247e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoCoding: 248e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, "VIDEO CODING:%5ld %5ld;", idEngine, 249e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 250e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 251e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoMixer: 252e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Print sleep time and API call 253e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " VIDEO MIX:%5ld %5ld;", idEngine, 254e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 255e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 256e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceFile: 257e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " FILE:%5ld %5ld;", idEngine, 258e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 259e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 260e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioProcessing: 261e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " AUDIO PROC:%5ld %5ld;", idEngine, 262e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 263e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 264e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioDevice: 265e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, "AUDIO DEVICE:%5ld %5ld;", idEngine, 266e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 267e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 268e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoRenderer: 269e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, "VIDEO RENDER:%5ld %5ld;", idEngine, 270e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 271e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 272e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoCapture: 273e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, "VIDEO CAPTUR:%5ld %5ld;", idEngine, 274e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 275e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 276e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoPreocessing: 277e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(traceMessage, " VIDEO PROC:%5ld %5ld;", idEngine, 278e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent idChannel); 279e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 280e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent default: 281e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert(false); 282e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 283e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 284e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else { 285e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent switch (module) 286e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 287e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVoice: 288e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " VOICE:%11ld;", idl); 289e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 290e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideo: 291e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " VIDEO:%11ld;", idl); 292e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 293e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceUtility: 294e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " UTILITY:%11ld;", idl); 295e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 296e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceRtpRtcp: 297e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " RTP/RTCP:%11ld;", idl); 298e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 299e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceTransport: 300e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " TRANSPORT:%11ld;", idl); 301e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 302e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioCoding: 303e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, "AUDIO CODING:%11ld;", idl); 304e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 305e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceSrtp: 306e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " SRTP:%11ld;", idl); 307e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 308e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioMixerServer: 309e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " AUDIO MIX/S:%11ld;", idl); 310e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 311e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioMixerClient: 312e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " AUDIO MIX/C:%11ld;", idl); 313e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 314e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoCoding: 315e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, "VIDEO CODING:%11ld;", idl); 316e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 317e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoMixer: 318e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " VIDEO MIX:%11ld;", idl); 319e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 320e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceFile: 321e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " FILE:%11ld;", idl); 322e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 323e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioProcessing: 324e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " AUDIO PROC:%11ld;", idl); 325e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 326e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceAudioDevice: 327e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, "AUDIO DEVICE:%11ld;", idl); 328e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 329e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoRenderer: 330e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, "VIDEO RENDER:%11ld;", idl); 331e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 332e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoCapture: 333e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, "VIDEO CAPTUR:%11ld;", idl); 334e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 335e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent case kTraceVideoPreocessing: 336e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf (traceMessage, " VIDEO PROC:%11ld;", idl); 337e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 338e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent default: 339e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert(false); 340e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 341e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 342e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 343e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // All messages are 25 characters. 344e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 25; 345e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 346e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 347e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 TraceImpl::SetTraceFileImpl(const WebRtc_Word8* fileNameUTF8, 348e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const bool addFileCounter) 349e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 350e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectInterface); 351e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 352e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Flush(); 353e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.CloseFile(); 354e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 355e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(fileNameUTF8) 356e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 357e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(addFileCounter) 358e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 359e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _fileCountText = 1; 360e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 361e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize]; 362e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CreateFileName(fileNameUTF8, fileNameWithCounterUTF8, 363e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _fileCountText); 364e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_traceFile.OpenFile(fileNameWithCounterUTF8, false, false, 365e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent true) == -1) 366e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 367e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 368e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 369e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }else { 370e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _fileCountText = 0; 371e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_traceFile.OpenFile(fileNameUTF8, false, false, true) == -1) 372e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 373e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 374e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 375e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 376e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 377e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText = 0; 378e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 379e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 380e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 381e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 TraceImpl::TraceFileImpl( 382e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize]) 383e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 384e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectInterface); 385e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return _traceFile.FileName(fileNameUTF8, FileWrapper::kMaxFileNameSize); 386e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 387e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 388e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 TraceImpl::SetTraceCallbackImpl(TraceCallback* callback) 389e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 390e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectInterface); 391e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _callback = callback; 392e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 393e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 394e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 395e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 TraceImpl::AddMessage( 396e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent char* traceMessage, 397e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE], 398e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord16 writtenSoFar) const 399e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 400e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 401e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int length = 0; 402e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(writtenSoFar >= WEBRTC_TRACE_MAX_MESSAGE_SIZE) 403e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 404e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 405e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 406e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // - 2 to leave room for newline and NULL termination 407e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32 408e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent length = _snprintf(traceMessage, 409e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WEBRTC_TRACE_MAX_MESSAGE_SIZE - writtenSoFar - 2, 410e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent "%s",msg); 411e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(length < 0) 412e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 413e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - writtenSoFar - 2; 414e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent traceMessage[length] = 0; 415e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 416e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else 417e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent length = snprintf(traceMessage, 418e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WEBRTC_TRACE_MAX_MESSAGE_SIZE-writtenSoFar-2, "%s",msg); 419e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(length < 0 || length > WEBRTC_TRACE_MAX_MESSAGE_SIZE-writtenSoFar - 2) 420e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 421e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - writtenSoFar - 2; 422e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent traceMessage[length] = 0; 423e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 424e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 425e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Length with NULL termination. 426e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return length+1; 427e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 428e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 429e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid TraceImpl::AddMessageToList( 430e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const char traceMessage[WEBRTC_TRACE_MAX_MESSAGE_SIZE], 431e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord16 length, 432e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const TraceLevel level) 433e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 434e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectArray); 435e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 436e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_nextFreeIdx[_activeQueue] >= WEBRTC_TRACE_MAX_QUEUE) 437e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 438e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if( ! _traceFile.Open() && 439e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent !_callback) 440e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 441e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Keep at least the last 1/4 of old messages when not logging. 442e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // TODO (hellner): isn't this redundant. The user will make it known 443e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // when to start logging. Why keep messages before 444e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // that? 445e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(int n = 0; n < WEBRTC_TRACE_MAX_QUEUE/4; n++) 446e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 447e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const int lastQuarterOffset = (3*WEBRTC_TRACE_MAX_QUEUE/4); 448e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_messageQueue[_activeQueue][n], 449e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _messageQueue[_activeQueue][n + lastQuarterOffset], 450e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WEBRTC_TRACE_MAX_MESSAGE_SIZE); 451e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 452e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx[_activeQueue] = WEBRTC_TRACE_MAX_QUEUE/4; 453e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else { 454e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // More messages are being written than there is room for in the 455e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // buffer. Drop any new messages. 456e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // TODO (hellner): its probably better to drop old messages instead 457e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // of new ones. One step further: if this happens 458e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // it's due to writing faster than what can be 459e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // processed. Maybe modify the filter at this point. 460e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // E.g. turn of STREAM. 461e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 462e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 463e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 464e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 465e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 idx = _nextFreeIdx[_activeQueue]; 466e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx[_activeQueue]++; 467e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 468e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _level[_activeQueue][idx] = level; 469e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _length[_activeQueue][idx] = length; 470e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_messageQueue[_activeQueue][idx], traceMessage, length); 471e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 472e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_nextFreeIdx[_activeQueue] == WEBRTC_TRACE_MAX_QUEUE-1) 473e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 474c55a96383497a772a307b346368133960b02ad03Eric Laurent // Logging more messages than can be worked off. Log a warning. 475c55a96383497a772a307b346368133960b02ad03Eric Laurent const char warning_msg[] = "WARNING MISSING TRACE MESSAGES\n"; 476c55a96383497a772a307b346368133960b02ad03Eric Laurent _level[_activeQueue][_nextFreeIdx[_activeQueue]] = kTraceWarning; 477c55a96383497a772a307b346368133960b02ad03Eric Laurent _length[_activeQueue][_nextFreeIdx[_activeQueue]] = strlen(warning_msg); 478e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_messageQueue[_activeQueue][_nextFreeIdx[_activeQueue]], 479c55a96383497a772a307b346368133960b02ad03Eric Laurent warning_msg, _length[_activeQueue][idx]); 480e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx[_activeQueue]++; 481e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 482e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 483e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 484e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool TraceImpl::Run(void* obj) 485e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 486e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return static_cast<TraceImpl*>(obj)->Process(); 487e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 488e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 489e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool TraceImpl::Process() 490e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 491e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_event.Wait(1000) == kEventSignaled) 492e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 493e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_traceFile.Open() || _callback) 494e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 495e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // File mode (not calback mode). 496e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WriteToFile(); 497e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 498e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else { 499e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Flush(); 500e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 501e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return true; 502e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 503e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 504e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid TraceImpl::WriteToFile() 505e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 506e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 localQueueActive = 0; 507e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 localNextFreeIdx = 0; 508e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 509e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // There are two buffer. One for reading (for writing to file) and one for 510e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // writing (for storing new messages). Let new messages be posted to the 511e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // unused buffer so that the current buffer can be flushed safely. 512e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 513e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectArray); 514e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent localNextFreeIdx = _nextFreeIdx[_activeQueue]; 515e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _nextFreeIdx[_activeQueue] = 0; 516e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent localQueueActive = _activeQueue; 517e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_activeQueue == 0) 518e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 519e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _activeQueue = 1; 520e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else 521e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 522e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _activeQueue = 0; 523e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 524e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 525e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(localNextFreeIdx == 0) 526e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 527e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 528e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 529e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 530e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionScoped lock(_critsectInterface); 531e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 532e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(WebRtc_UWord16 idx = 0; idx <localNextFreeIdx; idx++) 533e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 534e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceLevel localLevel = _level[localQueueActive][idx]; 535e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_callback) 536e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 537e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _callback->Print(localLevel, _messageQueue[localQueueActive][idx], 538e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _length[localQueueActive][idx]); 539e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 540e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_traceFile.Open()) 541e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 542e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_rowCountText > WEBRTC_TRACE_MAX_FILE_SIZE) 543e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 544e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // wrap file 545e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText = 0; 546e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Flush(); 547e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 548e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_fileCountText == 0) 549e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 550e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Rewind(); 551e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else 552e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 553e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 oldFileName[FileWrapper::kMaxFileNameSize]; 554e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 newFileName[FileWrapper::kMaxFileNameSize]; 555e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 556e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // get current name 557e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.FileName(oldFileName, 558e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent FileWrapper::kMaxFileNameSize); 559e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.CloseFile(); 560e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 561e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _fileCountText++; 562e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 563e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent UpdateFileName(oldFileName, newFileName, _fileCountText); 564e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 565e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_traceFile.OpenFile(newFileName, false, false, 566e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent true) == -1) 567e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 568e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 569e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 570e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 571e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 572e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_rowCountText == 0) 573e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 574e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 message[WEBRTC_TRACE_MAX_MESSAGE_SIZE + 1]; 575e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 length = AddDateTimeInfo(message); 576e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(length != -1) 577e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 578e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent message[length] = 0; 579e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent message[length-1] = '\n'; 580e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Write(message, length); 581e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText++; 582e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 583e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent length = AddBuildInfo(message); 584e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(length != -1) 585e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 586e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent message[length+1] = 0; 587e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent message[length] = '\n'; 588e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent message[length-1] = '\n'; 589e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Write(message, length+1); 590e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText++; 591e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText++; 592e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 593e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 594e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 length = _length[localQueueActive][idx]; 595e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _messageQueue[localQueueActive][idx][length] = 0; 596e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _messageQueue[localQueueActive][idx][length-1] = '\n'; 597e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _traceFile.Write(_messageQueue[localQueueActive][idx], length); 598e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _rowCountText++; 599e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 600e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 601e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 602e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 603e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid TraceImpl::AddImpl(const TraceLevel level, const TraceModule module, 604e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id, 605e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE]) 606e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 607e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (TraceCheck(level)) 608e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 609e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent char traceMessage[WEBRTC_TRACE_MAX_MESSAGE_SIZE]; 610e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent char* meassagePtr = traceMessage; 611e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 612e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 len = 0; 613e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 ackLen = 0; 614e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 615e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent len = AddLevel(meassagePtr, level); 616e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(len == -1) 617e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 618e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 619e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 620e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent meassagePtr += len; 621e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ackLen += len; 622e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 623e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent len = AddTime(meassagePtr, level); 624e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(len == -1) 625e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 626e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 627e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 628e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent meassagePtr += len; 629e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ackLen += len; 630e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 631e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent len = AddModuleAndId(meassagePtr, module, id); 632e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(len == -1) 633e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 634e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 635e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 636e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent meassagePtr += len; 637e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ackLen += len; 638e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 639e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent len = AddThreadId(meassagePtr); 640e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(len == -1) 641e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 642e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 643e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 644e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent meassagePtr += len; 645e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ackLen += len; 646e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 647e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent len = AddMessage(meassagePtr, msg, (WebRtc_UWord16)ackLen); 648e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(len == -1) 649e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 650e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return; 651e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 652e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ackLen += len; 653e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AddMessageToList(traceMessage,(WebRtc_UWord16)ackLen, level); 654e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 655e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Make sure that messages are written as soon as possible. 656e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _event.Set(); 657e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 658e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 659e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 660e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool TraceImpl::TraceCheck(const TraceLevel level) const 661e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 662e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return (level & levelFilter)? true:false; 663e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 664e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 665e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool TraceImpl::UpdateFileName( 666e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize], 667e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize], 668e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord32 newCount) const 669e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 670e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 length = (WebRtc_Word32)strlen(fileNameUTF8); 671e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(length < 0) 672e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 673e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 674e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 675e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 676e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 lengthWithoutFileEnding = length-1; 677e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while(lengthWithoutFileEnding > 0) 678e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 679e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(fileNameUTF8[lengthWithoutFileEnding] == '.') 680e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 681e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 682e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else { 683e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent lengthWithoutFileEnding--; 684e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 685e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 686e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(lengthWithoutFileEnding == 0) 687e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 688e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent lengthWithoutFileEnding = length; 689e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 690e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 lengthTo_ = lengthWithoutFileEnding - 1; 691e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while(lengthTo_ > 0) 692e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 693e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(fileNameUTF8[lengthTo_] == '_') 694e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 695e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 696e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else { 697e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent lengthTo_--; 698e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 699e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 700e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 701e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fileNameWithCounterUTF8, fileNameUTF8, lengthTo_); 702c55a96383497a772a307b346368133960b02ad03Eric Laurent sprintf(fileNameWithCounterUTF8+lengthTo_, "_%lu%s", 703c55a96383497a772a307b346368133960b02ad03Eric Laurent static_cast<long unsigned int> (newCount), 704e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fileNameUTF8+lengthWithoutFileEnding); 705e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return true; 706e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 707e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 708e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool TraceImpl::CreateFileName( 709e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize], 710e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize], 711e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord32 newCount) const 712e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 713e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 length = (WebRtc_Word32)strlen(fileNameUTF8); 714e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(length < 0) 715e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 716e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 717e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 718e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 719e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 lengthWithoutFileEnding = length-1; 720e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while(lengthWithoutFileEnding > 0) 721e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 722e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(fileNameUTF8[lengthWithoutFileEnding] == '.') 723e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 724e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent break; 725e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }else 726e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 727e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent lengthWithoutFileEnding--; 728e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 729e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 730e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(lengthWithoutFileEnding == 0) 731e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 732e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent lengthWithoutFileEnding = length; 733e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 734e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fileNameWithCounterUTF8, fileNameUTF8, lengthWithoutFileEnding); 735e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sprintf(fileNameWithCounterUTF8+lengthWithoutFileEnding, "_%lu%s", 736c55a96383497a772a307b346368133960b02ad03Eric Laurent static_cast<long unsigned int> (newCount), 737c55a96383497a772a307b346368133960b02ad03Eric Laurent fileNameUTF8+lengthWithoutFileEnding); 738e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return true; 739e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 740e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 741c55a96383497a772a307b346368133960b02ad03Eric Laurentvoid Trace::CreateTrace() 742c55a96383497a772a307b346368133960b02ad03Eric Laurent{ 743c55a96383497a772a307b346368133960b02ad03Eric Laurent TraceImpl::StaticInstance(kAddRef); 744c55a96383497a772a307b346368133960b02ad03Eric Laurent} 745c55a96383497a772a307b346368133960b02ad03Eric Laurent 746c55a96383497a772a307b346368133960b02ad03Eric Laurentvoid Trace::ReturnTrace() 747c55a96383497a772a307b346368133960b02ad03Eric Laurent{ 748c55a96383497a772a307b346368133960b02ad03Eric Laurent TraceImpl::StaticInstance(kRelease); 749c55a96383497a772a307b346368133960b02ad03Eric Laurent} 750c55a96383497a772a307b346368133960b02ad03Eric Laurent 751e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Trace::SetLevelFilter(WebRtc_UWord32 filter) 752e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 753e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent levelFilter = filter; 754e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 755c55a96383497a772a307b346368133960b02ad03Eric Laurent} 756e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 757e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Trace::LevelFilter(WebRtc_UWord32& filter) 758e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 759e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent filter = levelFilter; 760e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 761c55a96383497a772a307b346368133960b02ad03Eric Laurent} 762e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 763e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Trace::TraceFile(WebRtc_Word8 fileName[FileWrapper::kMaxFileNameSize]) 764e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 765e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceImpl* trace = TraceImpl::GetTrace(); 766e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(trace) 767e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 768e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int retVal = trace->TraceFileImpl(fileName); 769e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ReturnTrace(); 770e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return retVal; 771e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 772e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 773e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 774e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 775e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Trace::SetTraceFile(const WebRtc_Word8* fileName, 776e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const bool addFileCounter) 777e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 778e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceImpl* trace = TraceImpl::GetTrace(); 779e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(trace) 780e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 781e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int retVal = trace->SetTraceFileImpl(fileName, addFileCounter); 782e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ReturnTrace(); 783e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return retVal; 784e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 785e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 786e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 787e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 788e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Trace::SetTraceCallback(TraceCallback* callback) 789e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 790e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceImpl* trace = TraceImpl::GetTrace(); 791e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(trace) 792e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 793e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int retVal = trace->SetTraceCallbackImpl(callback); 794e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ReturnTrace(); 795e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return retVal; 796e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 797e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 798e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 799e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 800e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid Trace::Add(const TraceLevel level, const TraceModule module, 801e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id, const char* msg, ...) 802e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 803e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 804e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceImpl* trace = TraceImpl::GetTrace(level); 805e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(trace) 806e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 807e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(trace->TraceCheck(level)) 808e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 809e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent char tempBuff[WEBRTC_TRACE_MAX_MESSAGE_SIZE]; 810e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent char* buff = 0; 811e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(msg) 812e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 813e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent va_list args; 814e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent va_start(args, msg); 815e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32 816e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vsnprintf(tempBuff,WEBRTC_TRACE_MAX_MESSAGE_SIZE-1,msg,args); 817e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else 818e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent vsnprintf(tempBuff,WEBRTC_TRACE_MAX_MESSAGE_SIZE-1,msg,args); 819e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 820e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent va_end(args); 821e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent buff = tempBuff; 822e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 823e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent trace->AddImpl(level, module, id, buff); 824e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 825e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ReturnTrace(); 826e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 827e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 828c55a96383497a772a307b346368133960b02ad03Eric Laurent 829e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc 830