1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     test_TimerLog.cpp
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev:$
14  *---------------------------------------------------------------------------*/
15 
16 #include <nn/test/test_TimerLog.h>
17 
18 namespace nn{
19 namespace test{
20 
21 int TimerLog::s_Counter = 0;
22 int TimerLog::s_CounterMax = 0;
23 TimerLog *TimerLog::s_pHead = 0;
24 s64 TimerLog::s_BaseTick = 0;
25 TimerLog *TimerLog::s_pAverageBuffer = 0;
26 size_t TimerLog::s_AverageBufferSize = 0;
27 size_t TimerLog::s_AverageRepeatNum = 0;
28 size_t TimerLog::s_AverageElementNum = 0;
29 
Initialize(int num)30 void TimerLog::Initialize(int num)
31 {
32     Finalize();
33     s_pHead = new TimerLog[num];
34     s_Counter = 0;
35     s_CounterMax = num;
36     s_BaseTick = nn::os::Tick::GetSystemCurrent();
37 }
Finalize()38 void TimerLog::Finalize()
39 {
40     if (s_pHead)
41     {
42         delete[] s_pHead;
43     }
44 }
45 
ResetTimerLog()46 void TimerLog::ResetTimerLog()
47 {
48     s_BaseTick = nn::os::Tick::GetSystemCurrent();
49     s_Counter = 0;
50 }
51 
Reset()52 void TimerLog::Reset()
53 {
54     s_Counter = 0;
55     s_BaseTick = nn::os::Tick::GetSystemCurrent();
56 }
57 
InitializeAverage(size_t bufSize)58 void TimerLog::InitializeAverage(size_t bufSize)
59 {
60     if (s_pAverageBuffer)
61     {
62         delete[] s_pAverageBuffer;
63     }
64     s_pAverageBuffer = new TimerLog[bufSize];
65 
66     if (s_pAverageBuffer)
67     {
68         s_AverageBufferSize = bufSize;
69     }
70     else
71     {
72         nn::dbg::detail::TPrintf("[TimerLog] AverageBuffer Out of memory.\n");
73     }
74 
75     s_AverageRepeatNum = 0;
76 }
77 
FinalizeAverage()78 void TimerLog::FinalizeAverage()
79 {
80     if (s_pAverageBuffer)
81     {
82         delete[] s_pAverageBuffer;
83     }
84 }
85 
StartAverage()86 void TimerLog::StartAverage()
87 {
88     s_AverageRepeatNum = 0;
89     s_AverageElementNum = 0;
90     s_BaseTick = nn::os::Tick::GetSystemCurrent();
91     for (int i = 0; i < s_AverageBufferSize; ++i)
92     {
93         s_pAverageBuffer[i].m_Tick = 0;
94     }
95 }
96 
EndAverage(bool showLog,bool reset)97 void TimerLog::EndAverage(bool showLog, bool reset)
98 {
99     if (s_AverageRepeatNum)
100     {
101         for (int i = 0; i < s_AverageElementNum; i++)
102         {
103             s_pAverageBuffer[i].m_charTag = s_pHead[i].m_charTag;
104             s_pAverageBuffer[i].m_s32Tag = s_pHead[i].m_s32Tag;
105             s_pAverageBuffer[i].m_Line = s_pHead[i].m_Line;
106             s_pAverageBuffer[i].m_Tick /= s_AverageRepeatNum;
107         }
108     }
109 
110     if (showLog)
111     {
112         ShowAverageLog(reset);
113     }
114     else if (reset)
115     {
116         Reset();
117     }
118 }
119 
RenewAverage(bool reset)120 void TimerLog::RenewAverage(bool reset)
121 {
122     int imax = (s_Counter < s_CounterMax) ? s_Counter : s_CounterMax;
123     if (imax > s_AverageBufferSize)
124         imax = s_AverageBufferSize;
125 
126     s64 base = s_BaseTick;
127     for (int i = 0; i < imax; i++)
128     {
129         s_pAverageBuffer[i].m_Tick += s_pHead[i].m_Tick - base;
130         base = s_pHead[i].m_Tick;
131     }
132 
133     if (s_AverageElementNum < imax)
134         s_AverageElementNum = imax;
135 
136     s_AverageRepeatNum++;
137 
138     if (reset)
139     {
140         Reset();
141     }
142 }
143 
ShowAverageLog(bool reset)144 void TimerLog::ShowAverageLog(bool reset)
145 {
146     for (int i = 0; i < s_AverageElementNum; ++i)
147     {
148         s_pAverageBuffer[i].ShowElementLogAverageTime();
149     }
150     if (reset)
151     {
152         Reset();
153     }
154 }
155 
AddTimerLog(char charTag,s32 s32Tag,int line)156 void TimerLog::AddTimerLog(char charTag, s32 s32Tag, int line)
157 {
158     if (s_Counter < s_CounterMax)
159     {
160         s_pHead[s_Counter].m_charTag = charTag;
161         s_pHead[s_Counter].m_s32Tag = s32Tag;
162         s_pHead[s_Counter].m_Line = line;
163         s_pHead[s_Counter++].m_Tick = nn::os::Tick::GetSystemCurrent();
164     }
165     else if (s_Counter < 0x7FFFFFFF)
166     {
167         s_Counter++;
168     }
169 }
170 
ShowTimerLog(bool absolute,bool reset)171 void TimerLog::ShowTimerLog(bool absolute, bool reset)
172 {
173     int imax = (s_Counter < s_CounterMax) ? s_Counter : s_CounterMax;
174     if (absolute)
175     {
176         for (int i = 0; i < imax; i++)
177         {
178             s_pHead[i].ShowLogAbsTime();
179         }
180     }
181     else
182     {
183         s64 base = s_BaseTick;
184         for (int i = 0; i < imax; i++)
185         {
186             s_pHead[i].ShowLogRelTime(base);
187             base = s_pHead[i].m_Tick;
188         }
189     }
190 
191     if (s_Counter > s_CounterMax)
192     {
193         nn::dbg::detail::TPrintf("[TimerLog] %d logs were skipped (out of log buffer)\n", s_Counter - s_CounterMax);
194     }
195 
196     if (reset)
197     {
198         Reset();
199     }
200 }
201 
202 
203 } // namespace test
204 } // namespace nn
205 
206