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