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