/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_ #define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_ #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" #include "webrtc/system_wrappers/interface/event_wrapper.h" #include "webrtc/system_wrappers/interface/file_wrapper.h" #include "webrtc/system_wrappers/interface/static_instance.h" #include "webrtc/system_wrappers/interface/thread_wrapper.h" #include "webrtc/system_wrappers/interface/trace.h" namespace webrtc { // TODO(pwestin) WEBRTC_TRACE_MAX_QUEUE needs to be tweaked // TODO(hellner) the buffer should be close to how much the system can write to // file. Increasing the buffer will not solve anything. Sooner or // later the buffer is going to fill up anyways. #if defined(WEBRTC_IOS) #define WEBRTC_TRACE_MAX_QUEUE 2000 #else #define WEBRTC_TRACE_MAX_QUEUE 8000 #endif #define WEBRTC_TRACE_NUM_ARRAY 2 #define WEBRTC_TRACE_MAX_MESSAGE_SIZE 256 // Total buffer size is WEBRTC_TRACE_NUM_ARRAY (number of buffer partitions) * // WEBRTC_TRACE_MAX_QUEUE (number of lines per buffer partition) * // WEBRTC_TRACE_MAX_MESSAGE_SIZE (number of 1 byte charachters per line) = // 1 or 4 Mbyte. #define WEBRTC_TRACE_MAX_FILE_SIZE 100*1000 // Number of rows that may be written to file. On average 110 bytes per row (max // 256 bytes per row). So on average 110*100*1000 = 11 Mbyte, max 256*100*1000 = // 25.6 Mbyte class TraceImpl : public Trace { public: virtual ~TraceImpl(); static TraceImpl* CreateInstance(); static TraceImpl* GetTrace(const TraceLevel level = kTraceAll); WebRtc_Word32 SetTraceFileImpl(const char* file_name, const bool add_file_counter); WebRtc_Word32 TraceFileImpl( char file_name[FileWrapper::kMaxFileNameSize]); WebRtc_Word32 SetTraceCallbackImpl(TraceCallback* callback); void AddImpl(const TraceLevel level, const TraceModule module, const WebRtc_Word32 id, const char* msg); bool StopThread(); bool TraceCheck(const TraceLevel level) const; protected: TraceImpl(); static TraceImpl* StaticInstance(CountOperation count_operation, const TraceLevel level = kTraceAll); WebRtc_Word32 AddThreadId(char* trace_message) const; // OS specific implementations. virtual WebRtc_Word32 AddTime(char* trace_message, const TraceLevel level) const = 0; virtual WebRtc_Word32 AddBuildInfo(char* trace_message) const = 0; virtual WebRtc_Word32 AddDateTimeInfo(char* trace_message) const = 0; static bool Run(void* obj); bool Process(); private: friend class Trace; WebRtc_Word32 AddLevel(char* sz_message, const TraceLevel level) const; WebRtc_Word32 AddModuleAndId(char* trace_message, const TraceModule module, const WebRtc_Word32 id) const; WebRtc_Word32 AddMessage(char* trace_message, const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE], const WebRtc_UWord16 written_so_far) const; void AddMessageToList( const char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE], const WebRtc_UWord16 length, const TraceLevel level); bool UpdateFileName( const char file_name_utf8[FileWrapper::kMaxFileNameSize], char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize], const WebRtc_UWord32 new_count) const; bool CreateFileName( const char file_name_utf8[FileWrapper::kMaxFileNameSize], char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize], const WebRtc_UWord32 new_count) const; void WriteToFile(); CriticalSectionWrapper* critsect_interface_; TraceCallback* callback_; WebRtc_UWord32 row_count_text_; WebRtc_UWord32 file_count_text_; FileWrapper& trace_file_; ThreadWrapper& thread_; EventWrapper& event_; // critsect_array_ protects active_queue_. CriticalSectionWrapper* critsect_array_; WebRtc_UWord16 next_free_idx_[WEBRTC_TRACE_NUM_ARRAY]; TraceLevel level_[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE]; WebRtc_UWord16 length_[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE]; char* message_queue_[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE]; WebRtc_UWord8 active_queue_; }; } // namespace webrtc #endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_