1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Copyright (c) 2012 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#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_ 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_ 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "system_wrappers/interface/critical_section_wrapper.h" 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "system_wrappers/interface/event_wrapper.h" 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "system_wrappers/interface/file_wrapper.h" 17c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/static_instance.h" 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "system_wrappers/interface/trace.h" 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "system_wrappers/interface/thread_wrapper.h" 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc { 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// TODO (pwestin) WEBRTC_TRACE_MAX_QUEUE needs to be tweaked 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// TODO (hellner) the buffer should be close to how much the system can write to 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// file. Increasing the buffer will not solve anything. Sooner or 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// later the buffer is going to fill up anyways. 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#if defined(MAC_IPHONE) 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent #define WEBRTC_TRACE_MAX_QUEUE 2000 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent #define WEBRTC_TRACE_MAX_QUEUE 8000 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_TRACE_NUM_ARRAY 2 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_TRACE_MAX_MESSAGE_SIZE 256 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Total buffer size is WEBRTC_TRACE_NUM_ARRAY (number of buffer partitions) * 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// WEBRTC_TRACE_MAX_QUEUE (number of lines per buffer partition) * 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// WEBRTC_TRACE_MAX_MESSAGE_SIZE (number of 1 byte charachters per line) = 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// 1 or 4 Mbyte 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_TRACE_MAX_FILE_SIZE 100*1000 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Number of rows that may be written to file. On average 110 bytes per row (max 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// 256 bytes per row). So on average 110*100*1000 = 11 Mbyte, max 256*100*1000 = 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// 25.6 Mbyte 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass TraceImpl : public Trace 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ~TraceImpl(); 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 49c55a96383497a772a307b346368133960b02ad03Eric Laurent static TraceImpl* CreateInstance(); 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent static TraceImpl* GetTrace(const TraceLevel level = kTraceAll); 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 SetTraceFileImpl(const char* fileName, 53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const bool addFileCounter); 54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 TraceFileImpl( 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin char fileName[FileWrapper::kMaxFileNameSize]); 56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 SetTraceCallbackImpl(TraceCallback* callback); 58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void AddImpl(const TraceLevel level, const TraceModule module, 60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id, const char* msg); 61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool StopThread(); 63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool TraceCheck(const TraceLevel level) const; 65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprotected: 67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceImpl(); 68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 69c55a96383497a772a307b346368133960b02ad03Eric Laurent static TraceImpl* StaticInstance(CountOperation count_operation, 70c55a96383497a772a307b346368133960b02ad03Eric Laurent const TraceLevel level = kTraceAll); 71c55a96383497a772a307b346368133960b02ad03Eric Laurent 72a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 AddThreadId(char* traceMessage) const; 73a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // OS specific implementations 75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual WebRtc_Word32 AddTime(char* traceMessage, 76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const TraceLevel level) const = 0; 77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual WebRtc_Word32 AddBuildInfo(char* traceMessage) const = 0; 79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual WebRtc_Word32 AddDateTimeInfo(char* traceMessage) const = 0; 80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent static bool Run(void* obj); 82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool Process(); 83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprivate: 85c55a96383497a772a307b346368133960b02ad03Eric Laurent friend class Trace; 86c55a96383497a772a307b346368133960b02ad03Eric Laurent 87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 AddLevel(char* szMessage, const TraceLevel level) const; 88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 AddModuleAndId(char* traceMessage, const TraceModule module, 90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id) const; 91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 AddMessage(char* traceMessage, 93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE], 94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord16 writtenSoFar) const; 95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void AddMessageToList( 97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const char traceMessage[WEBRTC_TRACE_MAX_MESSAGE_SIZE], 98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord16 length, 99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const TraceLevel level); 100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool UpdateFileName( 102a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const char fileNameUTF8[FileWrapper::kMaxFileNameSize], 103a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin char fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize], 104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord32 newCount) const; 105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool CreateFileName( 107a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const char fileNameUTF8[FileWrapper::kMaxFileNameSize], 108a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin char fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize], 109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord32 newCount) const; 110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void WriteToFile(); 112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 113c55a96383497a772a307b346368133960b02ad03Eric Laurent CriticalSectionWrapper* _critsectInterface; 114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceCallback* _callback; 115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _rowCountText; 116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _fileCountText; 117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent FileWrapper& _traceFile; 119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ThreadWrapper& _thread; 120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EventWrapper& _event; 121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // _critsectArray protects _activeQueue 123c55a96383497a772a307b346368133960b02ad03Eric Laurent CriticalSectionWrapper* _critsectArray; 124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 _nextFreeIdx[WEBRTC_TRACE_NUM_ARRAY]; 125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent TraceLevel _level[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE]; 126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 _length[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE]; 127a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin char* _messageQueue[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE]; 128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 _activeQueue; 129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc 131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_ 133