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