xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/GUI/BenchmarkDialog.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Defs.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyException.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/System.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/SystemInfo.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ComboBox.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Edit.h"
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MethodProps.h"
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/DialogSize.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/HelpUtils.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/LangUtils.h"
26*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/resourceGui.h"
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #include "../../MyVersion.h"
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker #include "../Common/Bench.h"
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker #include "BenchmarkDialogRes.h"
33*f6dc9357SAndroid Build Coastguard Worker #include "BenchmarkDialog.h"
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker #define kHelpTopic "fm/benchmark.htm"
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker static const UINT_PTR kTimerID = 4;
40*f6dc9357SAndroid Build Coastguard Worker static const UINT kTimerElapse = 1000; // 1000
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker // use PRINT_ITER_TIME to show time of each iteration in log box
43*f6dc9357SAndroid Build Coastguard Worker // #define PRINT_ITER_TIME
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker static const unsigned kRatingVector_NumBundlesMax = 20;
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker enum MyBenchMessages
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker   k_Message_Finished = WM_APP + 1
50*f6dc9357SAndroid Build Coastguard Worker };
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker enum My_Message_WPARAM
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker   k_Msg_WPARM_Thread_Finished = 0,
55*f6dc9357SAndroid Build Coastguard Worker   k_Msg_WPARM_Iter_Finished,
56*f6dc9357SAndroid Build Coastguard Worker   k_Msg_WPARM_Enc1_Finished
57*f6dc9357SAndroid Build Coastguard Worker };
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker struct CBenchPassResult
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes Enc;
63*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes Dec;
64*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
65*f6dc9357SAndroid Build Coastguard Worker   DWORD Ticks;
66*f6dc9357SAndroid Build Coastguard Worker #endif
67*f6dc9357SAndroid Build Coastguard Worker   // CBenchInfo EncInfo; // for debug
68*f6dc9357SAndroid Build Coastguard Worker   // CBenchPassResult() {};
69*f6dc9357SAndroid Build Coastguard Worker };
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker struct CTotalBenchRes2: public CTotalBenchRes
73*f6dc9357SAndroid Build Coastguard Worker {
74*f6dc9357SAndroid Build Coastguard Worker   UInt64 UnpackSize;
75*f6dc9357SAndroid Build Coastguard Worker 
InitCTotalBenchRes276*f6dc9357SAndroid Build Coastguard Worker   void Init()
77*f6dc9357SAndroid Build Coastguard Worker   {
78*f6dc9357SAndroid Build Coastguard Worker     CTotalBenchRes::Init();
79*f6dc9357SAndroid Build Coastguard Worker     UnpackSize = 0;
80*f6dc9357SAndroid Build Coastguard Worker   }
81*f6dc9357SAndroid Build Coastguard Worker 
SetFrom_BenchInfoCTotalBenchRes282*f6dc9357SAndroid Build Coastguard Worker   void SetFrom_BenchInfo(const CBenchInfo &info)
83*f6dc9357SAndroid Build Coastguard Worker   {
84*f6dc9357SAndroid Build Coastguard Worker     NumIterations2 = 1;
85*f6dc9357SAndroid Build Coastguard Worker     Generate_From_BenchInfo(info);
86*f6dc9357SAndroid Build Coastguard Worker     UnpackSize = info.Get_UnpackSize_Full();
87*f6dc9357SAndroid Build Coastguard Worker   }
88*f6dc9357SAndroid Build Coastguard Worker 
Update_With_Res2CTotalBenchRes289*f6dc9357SAndroid Build Coastguard Worker   void Update_With_Res2(const CTotalBenchRes2 &r)
90*f6dc9357SAndroid Build Coastguard Worker   {
91*f6dc9357SAndroid Build Coastguard Worker     Update_With_Res(r);
92*f6dc9357SAndroid Build Coastguard Worker     UnpackSize += r.UnpackSize;
93*f6dc9357SAndroid Build Coastguard Worker   }
94*f6dc9357SAndroid Build Coastguard Worker };
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker struct CSyncData
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumPasses_Finished;
100*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
101*f6dc9357SAndroid Build Coastguard Worker   DWORD TotalTicks;
102*f6dc9357SAndroid Build Coastguard Worker #endif
103*f6dc9357SAndroid Build Coastguard Worker   int RatingVector_DeletedIndex;
104*f6dc9357SAndroid Build Coastguard Worker   // UInt64 RatingVector_NumDeleted;
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker   bool BenchWasFinished; // all passes were finished
107*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_Freq;
108*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_RatingVector;
109*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_Enc_1;
110*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_Enc;
111*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_Dec_1;
112*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_Dec;
113*f6dc9357SAndroid Build Coastguard Worker   bool NeedPrint_Tot; // intermediate Total was updated after current pass
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker   // UInt64 NumEncProgress; // for debug
116*f6dc9357SAndroid Build Coastguard Worker   // UInt64 NumDecProgress; // for debug
117*f6dc9357SAndroid Build Coastguard Worker   // CBenchInfo EncInfo; // for debug
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes2 Enc_BenchRes_1;
120*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes2 Enc_BenchRes;
121*f6dc9357SAndroid Build Coastguard Worker 
122*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes2 Dec_BenchRes_1;
123*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes2 Dec_BenchRes;
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker   void Init();
126*f6dc9357SAndroid Build Coastguard Worker };
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker 
Init()129*f6dc9357SAndroid Build Coastguard Worker void CSyncData::Init()
130*f6dc9357SAndroid Build Coastguard Worker {
131*f6dc9357SAndroid Build Coastguard Worker   NumPasses_Finished = 0;
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker   // NumEncProgress = 0;
134*f6dc9357SAndroid Build Coastguard Worker   // NumDecProgress = 0;
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker   Enc_BenchRes.Init();
137*f6dc9357SAndroid Build Coastguard Worker   Enc_BenchRes_1.Init();
138*f6dc9357SAndroid Build Coastguard Worker   Dec_BenchRes.Init();
139*f6dc9357SAndroid Build Coastguard Worker   Dec_BenchRes_1.Init();
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker   #ifdef PRINT_ITER_TIME
142*f6dc9357SAndroid Build Coastguard Worker   TotalTicks = 0;
143*f6dc9357SAndroid Build Coastguard Worker   #endif
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker   RatingVector_DeletedIndex = -1;
146*f6dc9357SAndroid Build Coastguard Worker   // RatingVector_NumDeleted = 0;
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker   BenchWasFinished =
149*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_Freq =
150*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_RatingVector =
151*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_Enc_1 =
152*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_Enc   =
153*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_Dec_1 =
154*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_Dec   =
155*f6dc9357SAndroid Build Coastguard Worker     NeedPrint_Tot   = false;
156*f6dc9357SAndroid Build Coastguard Worker }
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker 
159*f6dc9357SAndroid Build Coastguard Worker struct CBenchProgressSync
160*f6dc9357SAndroid Build Coastguard Worker {
161*f6dc9357SAndroid Build Coastguard Worker   bool Exit; // GUI asks BenchThread to Exit, and BenchThread reads that variable
162*f6dc9357SAndroid Build Coastguard Worker   bool TextWasChanged;
163*f6dc9357SAndroid Build Coastguard Worker 
164*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumThreads;
165*f6dc9357SAndroid Build Coastguard Worker   UInt64 DictSize;
166*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumPasses_Limit;
167*f6dc9357SAndroid Build Coastguard Worker   int Level;
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker   AString Text;
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   /* BenchFinish_Task_HRESULT    - for result from benchmark code
172*f6dc9357SAndroid Build Coastguard Worker      BenchFinish_Thread_HRESULT  - for Exceptions and service errors
173*f6dc9357SAndroid Build Coastguard Worker              these arreos must be shown even if user escapes benchmark */
174*f6dc9357SAndroid Build Coastguard Worker   HRESULT BenchFinish_Task_HRESULT;
175*f6dc9357SAndroid Build Coastguard Worker   HRESULT BenchFinish_Thread_HRESULT;
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumFreqThreadsPrev;
178*f6dc9357SAndroid Build Coastguard Worker   UString FreqString_Sync;
179*f6dc9357SAndroid Build Coastguard Worker   UString FreqString_GUI;
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker   // must be written by benchmark thread, read by GUI thread */
182*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CBenchPassResult> RatingVector;
183*f6dc9357SAndroid Build Coastguard Worker   CSyncData sd;
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CCriticalSection CS;
186*f6dc9357SAndroid Build Coastguard Worker 
CBenchProgressSyncCBenchProgressSync187*f6dc9357SAndroid Build Coastguard Worker   CBenchProgressSync()
188*f6dc9357SAndroid Build Coastguard Worker   {
189*f6dc9357SAndroid Build Coastguard Worker     NumPasses_Limit = 1;
190*f6dc9357SAndroid Build Coastguard Worker   }
191*f6dc9357SAndroid Build Coastguard Worker 
192*f6dc9357SAndroid Build Coastguard Worker   void Init();
193*f6dc9357SAndroid Build Coastguard Worker 
SendExitCBenchProgressSync194*f6dc9357SAndroid Build Coastguard Worker   void SendExit()
195*f6dc9357SAndroid Build Coastguard Worker   {
196*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(CS);
197*f6dc9357SAndroid Build Coastguard Worker     Exit = true;
198*f6dc9357SAndroid Build Coastguard Worker   }
199*f6dc9357SAndroid Build Coastguard Worker };
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker 
Init()202*f6dc9357SAndroid Build Coastguard Worker void CBenchProgressSync::Init()
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker   Exit = false;
205*f6dc9357SAndroid Build Coastguard Worker 
206*f6dc9357SAndroid Build Coastguard Worker   BenchFinish_Task_HRESULT = S_OK;
207*f6dc9357SAndroid Build Coastguard Worker   BenchFinish_Thread_HRESULT = S_OK;
208*f6dc9357SAndroid Build Coastguard Worker 
209*f6dc9357SAndroid Build Coastguard Worker   sd.Init();
210*f6dc9357SAndroid Build Coastguard Worker   RatingVector.Clear();
211*f6dc9357SAndroid Build Coastguard Worker 
212*f6dc9357SAndroid Build Coastguard Worker   NumFreqThreadsPrev = 0;
213*f6dc9357SAndroid Build Coastguard Worker   FreqString_Sync.Empty();
214*f6dc9357SAndroid Build Coastguard Worker   FreqString_GUI.Empty();
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker   Text.Empty();
217*f6dc9357SAndroid Build Coastguard Worker   TextWasChanged = true;
218*f6dc9357SAndroid Build Coastguard Worker }
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker struct CMyFont
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker   HFONT _font;
CMyFontCMyFont225*f6dc9357SAndroid Build Coastguard Worker   CMyFont(): _font(NULL) {}
~CMyFontCMyFont226*f6dc9357SAndroid Build Coastguard Worker   ~CMyFont()
227*f6dc9357SAndroid Build Coastguard Worker   {
228*f6dc9357SAndroid Build Coastguard Worker     if (_font)
229*f6dc9357SAndroid Build Coastguard Worker       DeleteObject(_font);
230*f6dc9357SAndroid Build Coastguard Worker   }
CreateCMyFont231*f6dc9357SAndroid Build Coastguard Worker   void Create(const LOGFONT *lplf)
232*f6dc9357SAndroid Build Coastguard Worker   {
233*f6dc9357SAndroid Build Coastguard Worker     _font = CreateFontIndirect(lplf);
234*f6dc9357SAndroid Build Coastguard Worker   }
235*f6dc9357SAndroid Build Coastguard Worker };
236*f6dc9357SAndroid Build Coastguard Worker 
237*f6dc9357SAndroid Build Coastguard Worker 
238*f6dc9357SAndroid Build Coastguard Worker class CBenchmarkDialog;
239*f6dc9357SAndroid Build Coastguard Worker 
240*f6dc9357SAndroid Build Coastguard Worker struct CThreadBenchmark
241*f6dc9357SAndroid Build Coastguard Worker {
242*f6dc9357SAndroid Build Coastguard Worker   CBenchmarkDialog *BenchmarkDialog;
243*f6dc9357SAndroid Build Coastguard Worker   DECL_EXTERNAL_CODECS_LOC_VARS_DECL
244*f6dc9357SAndroid Build Coastguard Worker   // HRESULT Result;
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker   HRESULT Process();
MyThreadFunctionCThreadBenchmark247*f6dc9357SAndroid Build Coastguard Worker   static THREAD_FUNC_DECL MyThreadFunction(void *param)
248*f6dc9357SAndroid Build Coastguard Worker   {
249*f6dc9357SAndroid Build Coastguard Worker     /* ((CThreadBenchmark *)param)->Result = */
250*f6dc9357SAndroid Build Coastguard Worker     ((CThreadBenchmark *)param)->Process();
251*f6dc9357SAndroid Build Coastguard Worker     return 0;
252*f6dc9357SAndroid Build Coastguard Worker   }
253*f6dc9357SAndroid Build Coastguard Worker };
254*f6dc9357SAndroid Build Coastguard Worker 
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker class CBenchmarkDialog:
257*f6dc9357SAndroid Build Coastguard Worker   public NWindows::NControl::CModalDialog
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker   bool _finishTime_WasSet;
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker   bool WasStopped_in_GUI;
262*f6dc9357SAndroid Build Coastguard Worker   bool ExitWasAsked_in_GUI;
263*f6dc9357SAndroid Build Coastguard Worker   bool NeedRestart;
264*f6dc9357SAndroid Build Coastguard Worker 
265*f6dc9357SAndroid Build Coastguard Worker   bool RamSize_Defined;
266*f6dc9357SAndroid Build Coastguard Worker 
267*f6dc9357SAndroid Build Coastguard Worker public:
268*f6dc9357SAndroid Build Coastguard Worker   bool TotalMode;
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker private:
271*f6dc9357SAndroid Build Coastguard Worker 
272*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CComboBox m_Dictionary;
273*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CComboBox m_NumThreads;
274*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CComboBox m_NumPasses;
275*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CEdit _consoleEdit;
276*f6dc9357SAndroid Build Coastguard Worker   UINT_PTR _timer;
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker   UInt32 _startTime;
279*f6dc9357SAndroid Build Coastguard Worker   UInt32 _finishTime;
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker   CMyFont _font;
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   size_t RamSize;
284*f6dc9357SAndroid Build Coastguard Worker   size_t RamSize_Limit;
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumPasses_Finished_Prev;
287*f6dc9357SAndroid Build Coastguard Worker 
288*f6dc9357SAndroid Build Coastguard Worker   UString ElapsedSec_Prev;
289*f6dc9357SAndroid Build Coastguard Worker 
InitSyncNew()290*f6dc9357SAndroid Build Coastguard Worker   void InitSyncNew()
291*f6dc9357SAndroid Build Coastguard Worker   {
292*f6dc9357SAndroid Build Coastguard Worker     NumPasses_Finished_Prev = (UInt32)(Int32)-1;
293*f6dc9357SAndroid Build Coastguard Worker     ElapsedSec_Prev.Empty();
294*f6dc9357SAndroid Build Coastguard Worker     Sync.Init();
295*f6dc9357SAndroid Build Coastguard Worker   }
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnInit() Z7_override;
298*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnDestroy() Z7_override;
299*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnSize(WPARAM /* wParam */, int xSize, int ySize) Z7_override;
300*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override;
301*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnCommand(unsigned code, unsigned itemID, LPARAM lParam) Z7_override;
302*f6dc9357SAndroid Build Coastguard Worker   virtual void OnHelp() Z7_override;
303*f6dc9357SAndroid Build Coastguard Worker   virtual void OnCancel() Z7_override;
304*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnTimer(WPARAM timerID, LPARAM callback) Z7_override;
305*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override;
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker   void Disable_Stop_Button();
308*f6dc9357SAndroid Build Coastguard Worker   void OnStopButton();
309*f6dc9357SAndroid Build Coastguard Worker   void RestartBenchmark();
310*f6dc9357SAndroid Build Coastguard Worker   void StartBenchmark();
311*f6dc9357SAndroid Build Coastguard Worker 
312*f6dc9357SAndroid Build Coastguard Worker   void UpdateGui();
313*f6dc9357SAndroid Build Coastguard Worker 
314*f6dc9357SAndroid Build Coastguard Worker   void PrintTime();
315*f6dc9357SAndroid Build Coastguard Worker   void PrintRating(UInt64 rating, UINT controlID);
316*f6dc9357SAndroid Build Coastguard Worker   void PrintUsage(UInt64 usage, UINT controlID);
317*f6dc9357SAndroid Build Coastguard Worker   void PrintBenchRes(const CTotalBenchRes2 &info, const UINT ids[]);
318*f6dc9357SAndroid Build Coastguard Worker 
319*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetNumberOfThreads();
320*f6dc9357SAndroid Build Coastguard Worker   size_t OnChangeDictionary();
321*f6dc9357SAndroid Build Coastguard Worker 
322*f6dc9357SAndroid Build Coastguard Worker   void SetItemText_Number(unsigned itemID, UInt64 val, LPCTSTR post = NULL);
323*f6dc9357SAndroid Build Coastguard Worker   void Print_MemUsage(UString &s, UInt64 memUsage) const;
IsMemoryUsageOK(UInt64 memUsage) const324*f6dc9357SAndroid Build Coastguard Worker   bool IsMemoryUsageOK(UInt64 memUsage) const
325*f6dc9357SAndroid Build Coastguard Worker     { return memUsage + (1 << 20) <= RamSize_Limit; }
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker   void MyKillTimer();
328*f6dc9357SAndroid Build Coastguard Worker 
SendExit_Status(const wchar_t * message)329*f6dc9357SAndroid Build Coastguard Worker   void SendExit_Status(const wchar_t *message)
330*f6dc9357SAndroid Build Coastguard Worker   {
331*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_BENCH_ERROR_MESSAGE, message);
332*f6dc9357SAndroid Build Coastguard Worker     Sync.SendExit();
333*f6dc9357SAndroid Build Coastguard Worker   }
334*f6dc9357SAndroid Build Coastguard Worker 
335*f6dc9357SAndroid Build Coastguard Worker public:
336*f6dc9357SAndroid Build Coastguard Worker   CBenchProgressSync Sync;
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CProperty> Props;
339*f6dc9357SAndroid Build Coastguard Worker 
340*f6dc9357SAndroid Build Coastguard Worker   CSysString Bench2Text;
341*f6dc9357SAndroid Build Coastguard Worker 
342*f6dc9357SAndroid Build Coastguard Worker   NWindows::CThread _thread;
343*f6dc9357SAndroid Build Coastguard Worker   CThreadBenchmark _threadBenchmark;
344*f6dc9357SAndroid Build Coastguard Worker 
CBenchmarkDialog()345*f6dc9357SAndroid Build Coastguard Worker   CBenchmarkDialog():
346*f6dc9357SAndroid Build Coastguard Worker       WasStopped_in_GUI(false),
347*f6dc9357SAndroid Build Coastguard Worker       ExitWasAsked_in_GUI(false),
348*f6dc9357SAndroid Build Coastguard Worker       NeedRestart(false),
349*f6dc9357SAndroid Build Coastguard Worker       TotalMode(false),
350*f6dc9357SAndroid Build Coastguard Worker       _timer(0)
351*f6dc9357SAndroid Build Coastguard Worker       {}
352*f6dc9357SAndroid Build Coastguard Worker 
353*f6dc9357SAndroid Build Coastguard Worker   ~CBenchmarkDialog() Z7_DESTRUCTOR_override;
354*f6dc9357SAndroid Build Coastguard Worker 
PostMsg_Finish(WPARAM wparam)355*f6dc9357SAndroid Build Coastguard Worker   bool PostMsg_Finish(WPARAM wparam)
356*f6dc9357SAndroid Build Coastguard Worker   {
357*f6dc9357SAndroid Build Coastguard Worker     if ((HWND)*this)
358*f6dc9357SAndroid Build Coastguard Worker       return PostMsg(k_Message_Finished, wparam);
359*f6dc9357SAndroid Build Coastguard Worker     // the (HWND)*this is NULL only for some internal code failure
360*f6dc9357SAndroid Build Coastguard Worker     return true;
361*f6dc9357SAndroid Build Coastguard Worker   }
362*f6dc9357SAndroid Build Coastguard Worker 
Create(HWND wndParent=NULL)363*f6dc9357SAndroid Build Coastguard Worker   INT_PTR Create(HWND wndParent = NULL)
364*f6dc9357SAndroid Build Coastguard Worker   {
365*f6dc9357SAndroid Build Coastguard Worker     BIG_DIALOG_SIZE(332, 228);
366*f6dc9357SAndroid Build Coastguard Worker     return CModalDialog::Create(TotalMode ? IDD_BENCH_TOTAL : SIZED_DIALOG(IDD_BENCH), wndParent);
367*f6dc9357SAndroid Build Coastguard Worker   }
MessageBoxError(LPCWSTR message)368*f6dc9357SAndroid Build Coastguard Worker   void MessageBoxError(LPCWSTR message)
369*f6dc9357SAndroid Build Coastguard Worker   {
370*f6dc9357SAndroid Build Coastguard Worker     MessageBoxW(*this, message, L"7-Zip", MB_ICONERROR);
371*f6dc9357SAndroid Build Coastguard Worker   }
MessageBoxError_Status(LPCWSTR message)372*f6dc9357SAndroid Build Coastguard Worker   void MessageBoxError_Status(LPCWSTR message)
373*f6dc9357SAndroid Build Coastguard Worker   {
374*f6dc9357SAndroid Build Coastguard Worker     UString s ("ERROR: ");
375*f6dc9357SAndroid Build Coastguard Worker     s += message;
376*f6dc9357SAndroid Build Coastguard Worker     MessageBoxError(s);
377*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_BENCH_ERROR_MESSAGE, s);
378*f6dc9357SAndroid Build Coastguard Worker   }
379*f6dc9357SAndroid Build Coastguard Worker };
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker 
382*f6dc9357SAndroid Build Coastguard Worker 
383*f6dc9357SAndroid Build Coastguard Worker 
384*f6dc9357SAndroid Build Coastguard Worker 
385*f6dc9357SAndroid Build Coastguard Worker 
386*f6dc9357SAndroid Build Coastguard Worker 
387*f6dc9357SAndroid Build Coastguard Worker 
388*f6dc9357SAndroid Build Coastguard Worker 
389*f6dc9357SAndroid Build Coastguard Worker UString HResultToMessage(HRESULT errorCode);
390*f6dc9357SAndroid Build Coastguard Worker 
391*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
392*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
393*f6dc9357SAndroid Build Coastguard Worker {
394*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DICTIONARY,
395*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_MEMORY,
396*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_NUM_THREADS,
397*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_SIZE,
398*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_RATING_LABEL,
399*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_USAGE_LABEL,
400*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_RPU_LABEL,
401*f6dc9357SAndroid Build Coastguard Worker   IDG_BENCH_COMPRESSING,
402*f6dc9357SAndroid Build Coastguard Worker   IDG_BENCH_DECOMPRESSING,
403*f6dc9357SAndroid Build Coastguard Worker   IDG_BENCH_TOTAL_RATING,
404*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_CURRENT,
405*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_RESULTING,
406*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_ELAPSED,
407*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_PASSES,
408*f6dc9357SAndroid Build Coastguard Worker   IDB_STOP,
409*f6dc9357SAndroid Build Coastguard Worker   IDB_RESTART
410*f6dc9357SAndroid Build Coastguard Worker };
411*f6dc9357SAndroid Build Coastguard Worker 
412*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs_RemoveColon[] =
413*f6dc9357SAndroid Build Coastguard Worker {
414*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_SPEED
415*f6dc9357SAndroid Build Coastguard Worker };
416*f6dc9357SAndroid Build Coastguard Worker 
417*f6dc9357SAndroid Build Coastguard Worker #endif
418*f6dc9357SAndroid Build Coastguard Worker 
419*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kProcessingString = TEXT("...");
420*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kGB = TEXT(" GB");
421*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kMB = TEXT(" MB");
422*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kKB = TEXT(" KB");
423*f6dc9357SAndroid Build Coastguard Worker // static LPCTSTR const kMIPS = TEXT(" MIPS");
424*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kKBs = TEXT(" KB/s");
425*f6dc9357SAndroid Build Coastguard Worker 
426*f6dc9357SAndroid Build Coastguard Worker static const unsigned kMinDicLogSize = 18;
427*f6dc9357SAndroid Build Coastguard Worker 
428*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kMinDicSize = (UInt32)1 << kMinDicLogSize;
429*f6dc9357SAndroid Build Coastguard Worker static const size_t kMaxDicSize = (size_t)1 << (22 + sizeof(size_t) / 4 * 5);
430*f6dc9357SAndroid Build Coastguard Worker // static const size_t kMaxDicSize = (size_t)1 << 16;
431*f6dc9357SAndroid Build Coastguard Worker     /*
432*f6dc9357SAndroid Build Coastguard Worker     #ifdef MY_CPU_64BIT
433*f6dc9357SAndroid Build Coastguard Worker       (UInt32)(Int32)-1; // we can use it, if we want 4 GB buffer
434*f6dc9357SAndroid Build Coastguard Worker       // (UInt32)15 << 28;
435*f6dc9357SAndroid Build Coastguard Worker     #else
436*f6dc9357SAndroid Build Coastguard Worker       (UInt32)1 << 27;
437*f6dc9357SAndroid Build Coastguard Worker     #endif
438*f6dc9357SAndroid Build Coastguard Worker     */
439*f6dc9357SAndroid Build Coastguard Worker 
440*f6dc9357SAndroid Build Coastguard Worker 
ComboBox_Add_UInt32(NWindows::NControl::CComboBox & cb,UInt32 v)441*f6dc9357SAndroid Build Coastguard Worker static int ComboBox_Add_UInt32(NWindows::NControl::CComboBox &cb, UInt32 v)
442*f6dc9357SAndroid Build Coastguard Worker {
443*f6dc9357SAndroid Build Coastguard Worker   TCHAR s[16];
444*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt32ToString(v, s);
445*f6dc9357SAndroid Build Coastguard Worker   const int index = (int)cb.AddString(s);
446*f6dc9357SAndroid Build Coastguard Worker   cb.SetItemData(index, (LPARAM)v);
447*f6dc9357SAndroid Build Coastguard Worker   return index;
448*f6dc9357SAndroid Build Coastguard Worker }
449*f6dc9357SAndroid Build Coastguard Worker 
450*f6dc9357SAndroid Build Coastguard Worker 
OnInit()451*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnInit()
452*f6dc9357SAndroid Build Coastguard Worker {
453*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LANG
454*f6dc9357SAndroid Build Coastguard Worker   LangSetWindowText(*this, IDD_BENCH);
455*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
456*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems_RemoveColon(*this, kLangIDs_RemoveColon, Z7_ARRAY_SIZE(kLangIDs_RemoveColon));
457*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItemText(*this, IDT_BENCH_CURRENT2, IDT_BENCH_CURRENT);
458*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItemText(*this, IDT_BENCH_RESULTING2, IDT_BENCH_RESULTING);
459*f6dc9357SAndroid Build Coastguard Worker   #endif
460*f6dc9357SAndroid Build Coastguard Worker 
461*f6dc9357SAndroid Build Coastguard Worker   InitSyncNew();
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker   if (TotalMode)
464*f6dc9357SAndroid Build Coastguard Worker   {
465*f6dc9357SAndroid Build Coastguard Worker     _consoleEdit.Attach(GetItem(IDE_BENCH2_EDIT));
466*f6dc9357SAndroid Build Coastguard Worker     LOGFONT f;
467*f6dc9357SAndroid Build Coastguard Worker     memset(&f, 0, sizeof(f));
468*f6dc9357SAndroid Build Coastguard Worker     f.lfHeight = 14;
469*f6dc9357SAndroid Build Coastguard Worker     f.lfWidth = 0;
470*f6dc9357SAndroid Build Coastguard Worker     f.lfWeight = FW_DONTCARE;
471*f6dc9357SAndroid Build Coastguard Worker     f.lfCharSet = DEFAULT_CHARSET;
472*f6dc9357SAndroid Build Coastguard Worker     f.lfOutPrecision = OUT_DEFAULT_PRECIS;
473*f6dc9357SAndroid Build Coastguard Worker     f.lfClipPrecision = CLIP_DEFAULT_PRECIS;
474*f6dc9357SAndroid Build Coastguard Worker     f.lfQuality = DEFAULT_QUALITY;
475*f6dc9357SAndroid Build Coastguard Worker 
476*f6dc9357SAndroid Build Coastguard Worker     f.lfPitchAndFamily = FIXED_PITCH;
477*f6dc9357SAndroid Build Coastguard Worker     // MyStringCopy(f.lfFaceName, TEXT(""));
478*f6dc9357SAndroid Build Coastguard Worker     // f.lfFaceName[0] = 0;
479*f6dc9357SAndroid Build Coastguard Worker     _font.Create(&f);
480*f6dc9357SAndroid Build Coastguard Worker     if (_font._font)
481*f6dc9357SAndroid Build Coastguard Worker       _consoleEdit.SendMsg(WM_SETFONT, (WPARAM)_font._font, TRUE);
482*f6dc9357SAndroid Build Coastguard Worker   }
483*f6dc9357SAndroid Build Coastguard Worker 
484*f6dc9357SAndroid Build Coastguard Worker   UInt32 numCPUs = 1;
485*f6dc9357SAndroid Build Coastguard Worker 
486*f6dc9357SAndroid Build Coastguard Worker   {
487*f6dc9357SAndroid Build Coastguard Worker     AString s ("/ ");
488*f6dc9357SAndroid Build Coastguard Worker 
489*f6dc9357SAndroid Build Coastguard Worker     NSystem::CProcessAffinity threadsInfo;
490*f6dc9357SAndroid Build Coastguard Worker     threadsInfo.InitST();
491*f6dc9357SAndroid Build Coastguard Worker 
492*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_ST
493*f6dc9357SAndroid Build Coastguard Worker     if (threadsInfo.Get() && threadsInfo.processAffinityMask != 0)
494*f6dc9357SAndroid Build Coastguard Worker       numCPUs = threadsInfo.GetNumProcessThreads();
495*f6dc9357SAndroid Build Coastguard Worker     else
496*f6dc9357SAndroid Build Coastguard Worker       numCPUs = NSystem::GetNumberOfProcessors();
497*f6dc9357SAndroid Build Coastguard Worker     #endif
498*f6dc9357SAndroid Build Coastguard Worker 
499*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(numCPUs);
500*f6dc9357SAndroid Build Coastguard Worker     s += GetProcessThreadsInfo(threadsInfo);
501*f6dc9357SAndroid Build Coastguard Worker     SetItemTextA(IDT_BENCH_HARDWARE_THREADS, s);
502*f6dc9357SAndroid Build Coastguard Worker 
503*f6dc9357SAndroid Build Coastguard Worker     {
504*f6dc9357SAndroid Build Coastguard Worker       AString s2;
505*f6dc9357SAndroid Build Coastguard Worker       GetSysInfo(s, s2);
506*f6dc9357SAndroid Build Coastguard Worker       SetItemTextA(IDT_BENCH_SYS1, s);
507*f6dc9357SAndroid Build Coastguard Worker       if (s != s2 && !s2.IsEmpty())
508*f6dc9357SAndroid Build Coastguard Worker         SetItemTextA(IDT_BENCH_SYS2, s2);
509*f6dc9357SAndroid Build Coastguard Worker     }
510*f6dc9357SAndroid Build Coastguard Worker     {
511*f6dc9357SAndroid Build Coastguard Worker       AString registers;
512*f6dc9357SAndroid Build Coastguard Worker       GetCpuName_MultiLine(s, registers);
513*f6dc9357SAndroid Build Coastguard Worker       SetItemTextA(IDT_BENCH_CPU, s);
514*f6dc9357SAndroid Build Coastguard Worker     }
515*f6dc9357SAndroid Build Coastguard Worker     {
516*f6dc9357SAndroid Build Coastguard Worker       GetOsInfoText(s);
517*f6dc9357SAndroid Build Coastguard Worker       s += " : ";
518*f6dc9357SAndroid Build Coastguard Worker       AddCpuFeatures(s);
519*f6dc9357SAndroid Build Coastguard Worker       SetItemTextA(IDT_BENCH_CPU_FEATURE, s);
520*f6dc9357SAndroid Build Coastguard Worker     }
521*f6dc9357SAndroid Build Coastguard Worker 
522*f6dc9357SAndroid Build Coastguard Worker     s = "7-Zip " MY_VERSION_CPU;
523*f6dc9357SAndroid Build Coastguard Worker     SetItemTextA(IDT_BENCH_VER, s);
524*f6dc9357SAndroid Build Coastguard Worker   }
525*f6dc9357SAndroid Build Coastguard Worker 
526*f6dc9357SAndroid Build Coastguard Worker 
527*f6dc9357SAndroid Build Coastguard Worker   // ----- Num Threads ----------
528*f6dc9357SAndroid Build Coastguard Worker 
529*f6dc9357SAndroid Build Coastguard Worker   if (numCPUs < 1)
530*f6dc9357SAndroid Build Coastguard Worker     numCPUs = 1;
531*f6dc9357SAndroid Build Coastguard Worker   numCPUs = MyMin(numCPUs, (UInt32)(1 << 6)); // it's WIN32 limit
532*f6dc9357SAndroid Build Coastguard Worker 
533*f6dc9357SAndroid Build Coastguard Worker   UInt32 numThreads = Sync.NumThreads;
534*f6dc9357SAndroid Build Coastguard Worker 
535*f6dc9357SAndroid Build Coastguard Worker   if (numThreads == (UInt32)(Int32)-1)
536*f6dc9357SAndroid Build Coastguard Worker     numThreads = numCPUs;
537*f6dc9357SAndroid Build Coastguard Worker   if (numThreads > 1)
538*f6dc9357SAndroid Build Coastguard Worker     numThreads &= ~(UInt32)1;
539*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kNumThreadsMax = (1 << 12);
540*f6dc9357SAndroid Build Coastguard Worker   if (numThreads > kNumThreadsMax)
541*f6dc9357SAndroid Build Coastguard Worker     numThreads = kNumThreadsMax;
542*f6dc9357SAndroid Build Coastguard Worker 
543*f6dc9357SAndroid Build Coastguard Worker   m_NumThreads.Attach(GetItem(IDC_BENCH_NUM_THREADS));
544*f6dc9357SAndroid Build Coastguard Worker   const UInt32 numTheads_Combo = numCPUs * 2;
545*f6dc9357SAndroid Build Coastguard Worker   UInt32 v = 1;
546*f6dc9357SAndroid Build Coastguard Worker   int cur = 0;
547*f6dc9357SAndroid Build Coastguard Worker   for (; v <= numTheads_Combo;)
548*f6dc9357SAndroid Build Coastguard Worker   {
549*f6dc9357SAndroid Build Coastguard Worker     int index = ComboBox_Add_UInt32(m_NumThreads, v);
550*f6dc9357SAndroid Build Coastguard Worker     const UInt32 vNext = v + (v < 2 ? 1 : 2);
551*f6dc9357SAndroid Build Coastguard Worker     if (v <= numThreads)
552*f6dc9357SAndroid Build Coastguard Worker     if (numThreads < vNext || vNext > numTheads_Combo)
553*f6dc9357SAndroid Build Coastguard Worker     {
554*f6dc9357SAndroid Build Coastguard Worker       if (v != numThreads)
555*f6dc9357SAndroid Build Coastguard Worker         index = ComboBox_Add_UInt32(m_NumThreads, numThreads);
556*f6dc9357SAndroid Build Coastguard Worker       cur = index;
557*f6dc9357SAndroid Build Coastguard Worker     }
558*f6dc9357SAndroid Build Coastguard Worker     v = vNext;
559*f6dc9357SAndroid Build Coastguard Worker   }
560*f6dc9357SAndroid Build Coastguard Worker   m_NumThreads.SetCurSel(cur);
561*f6dc9357SAndroid Build Coastguard Worker   Sync.NumThreads = GetNumberOfThreads();
562*f6dc9357SAndroid Build Coastguard Worker 
563*f6dc9357SAndroid Build Coastguard Worker 
564*f6dc9357SAndroid Build Coastguard Worker   // ----- Dictionary ----------
565*f6dc9357SAndroid Build Coastguard Worker 
566*f6dc9357SAndroid Build Coastguard Worker   m_Dictionary.Attach(GetItem(IDC_BENCH_DICTIONARY));
567*f6dc9357SAndroid Build Coastguard Worker 
568*f6dc9357SAndroid Build Coastguard Worker   RamSize = (UInt64)(sizeof(size_t)) << 29;
569*f6dc9357SAndroid Build Coastguard Worker   RamSize_Defined = NSystem::GetRamSize(RamSize);
570*f6dc9357SAndroid Build Coastguard Worker 
571*f6dc9357SAndroid Build Coastguard Worker 
572*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
573*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kNormalizedCeSize = (16 << 20);
574*f6dc9357SAndroid Build Coastguard Worker   if (RamSize > kNormalizedCeSize && RamSize < (33 << 20))
575*f6dc9357SAndroid Build Coastguard Worker     RamSize = kNormalizedCeSize;
576*f6dc9357SAndroid Build Coastguard Worker   #endif
577*f6dc9357SAndroid Build Coastguard Worker   RamSize_Limit = RamSize / 16 * 15;
578*f6dc9357SAndroid Build Coastguard Worker 
579*f6dc9357SAndroid Build Coastguard Worker   if (Sync.DictSize == (UInt64)(Int64)-1)
580*f6dc9357SAndroid Build Coastguard Worker   {
581*f6dc9357SAndroid Build Coastguard Worker     unsigned dicSizeLog = 25;
582*f6dc9357SAndroid Build Coastguard Worker     #ifdef UNDER_CE
583*f6dc9357SAndroid Build Coastguard Worker     dicSizeLog = 20;
584*f6dc9357SAndroid Build Coastguard Worker     #endif
585*f6dc9357SAndroid Build Coastguard Worker     if (RamSize_Defined)
586*f6dc9357SAndroid Build Coastguard Worker     for (; dicSizeLog > kBenchMinDicLogSize; dicSizeLog--)
587*f6dc9357SAndroid Build Coastguard Worker       if (IsMemoryUsageOK(GetBenchMemoryUsage(
588*f6dc9357SAndroid Build Coastguard Worker           Sync.NumThreads, Sync.Level, (UInt64)1 << dicSizeLog, TotalMode)))
589*f6dc9357SAndroid Build Coastguard Worker         break;
590*f6dc9357SAndroid Build Coastguard Worker     Sync.DictSize = (UInt64)1 << dicSizeLog;
591*f6dc9357SAndroid Build Coastguard Worker   }
592*f6dc9357SAndroid Build Coastguard Worker 
593*f6dc9357SAndroid Build Coastguard Worker   if (Sync.DictSize < kMinDicSize) Sync.DictSize = kMinDicSize;
594*f6dc9357SAndroid Build Coastguard Worker   if (Sync.DictSize > kMaxDicSize) Sync.DictSize = kMaxDicSize;
595*f6dc9357SAndroid Build Coastguard Worker 
596*f6dc9357SAndroid Build Coastguard Worker   cur = 0;
597*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = (kMinDicLogSize - 1) * 2; i <= (32 - 1) * 2; i++)
598*f6dc9357SAndroid Build Coastguard Worker    {
599*f6dc9357SAndroid Build Coastguard Worker       const size_t dict = (size_t)(2 + (i & 1)) << (i / 2);
600*f6dc9357SAndroid Build Coastguard Worker       // if (i == (32 - 1) * 2) dict = kMaxDicSize;
601*f6dc9357SAndroid Build Coastguard Worker       TCHAR s[32];
602*f6dc9357SAndroid Build Coastguard Worker       const TCHAR *post;
603*f6dc9357SAndroid Build Coastguard Worker       UInt32 d;
604*f6dc9357SAndroid Build Coastguard Worker            if (dict >= ((UInt32)1 << 31)) { d = (UInt32)(dict >> 30); post = kGB; }
605*f6dc9357SAndroid Build Coastguard Worker       else if (dict >= ((UInt32)1 << 21)) { d = (UInt32)(dict >> 20); post = kMB; }
606*f6dc9357SAndroid Build Coastguard Worker       else                                { d = (UInt32)(dict >> 10); post = kKB; }
607*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt32ToString(d, s);
608*f6dc9357SAndroid Build Coastguard Worker       lstrcat(s, post);
609*f6dc9357SAndroid Build Coastguard Worker       const int index = (int)m_Dictionary.AddString(s);
610*f6dc9357SAndroid Build Coastguard Worker       m_Dictionary.SetItemData(index, (LPARAM)dict);
611*f6dc9357SAndroid Build Coastguard Worker       if (dict <= Sync.DictSize)
612*f6dc9357SAndroid Build Coastguard Worker         cur = index;
613*f6dc9357SAndroid Build Coastguard Worker       if (dict >= kMaxDicSize)
614*f6dc9357SAndroid Build Coastguard Worker         break;
615*f6dc9357SAndroid Build Coastguard Worker     }
616*f6dc9357SAndroid Build Coastguard Worker   m_Dictionary.SetCurSel(cur);
617*f6dc9357SAndroid Build Coastguard Worker 
618*f6dc9357SAndroid Build Coastguard Worker 
619*f6dc9357SAndroid Build Coastguard Worker   // ----- Num Passes ----------
620*f6dc9357SAndroid Build Coastguard Worker 
621*f6dc9357SAndroid Build Coastguard Worker   m_NumPasses.Attach(GetItem(IDC_BENCH_NUM_PASSES));
622*f6dc9357SAndroid Build Coastguard Worker   cur = 0;
623*f6dc9357SAndroid Build Coastguard Worker   v = 1;
624*f6dc9357SAndroid Build Coastguard Worker   for (;;)
625*f6dc9357SAndroid Build Coastguard Worker   {
626*f6dc9357SAndroid Build Coastguard Worker     int index = ComboBox_Add_UInt32(m_NumPasses, v);
627*f6dc9357SAndroid Build Coastguard Worker     const bool isLast = (v >= 10000000);
628*f6dc9357SAndroid Build Coastguard Worker     UInt32 vNext = v * 10;
629*f6dc9357SAndroid Build Coastguard Worker          if (v < 2) vNext = 2;
630*f6dc9357SAndroid Build Coastguard Worker     else if (v < 5) vNext = 5;
631*f6dc9357SAndroid Build Coastguard Worker     else if (v < 10) vNext = 10;
632*f6dc9357SAndroid Build Coastguard Worker 
633*f6dc9357SAndroid Build Coastguard Worker     if (v <= Sync.NumPasses_Limit)
634*f6dc9357SAndroid Build Coastguard Worker     if (isLast || Sync.NumPasses_Limit < vNext)
635*f6dc9357SAndroid Build Coastguard Worker     {
636*f6dc9357SAndroid Build Coastguard Worker       if (v != Sync.NumPasses_Limit)
637*f6dc9357SAndroid Build Coastguard Worker         index = ComboBox_Add_UInt32(m_NumPasses, Sync.NumPasses_Limit);
638*f6dc9357SAndroid Build Coastguard Worker       cur = index;
639*f6dc9357SAndroid Build Coastguard Worker     }
640*f6dc9357SAndroid Build Coastguard Worker     v = vNext;
641*f6dc9357SAndroid Build Coastguard Worker     if (isLast)
642*f6dc9357SAndroid Build Coastguard Worker       break;
643*f6dc9357SAndroid Build Coastguard Worker   }
644*f6dc9357SAndroid Build Coastguard Worker   m_NumPasses.SetCurSel(cur);
645*f6dc9357SAndroid Build Coastguard Worker 
646*f6dc9357SAndroid Build Coastguard Worker   if (TotalMode)
647*f6dc9357SAndroid Build Coastguard Worker     NormalizeSize(true);
648*f6dc9357SAndroid Build Coastguard Worker   else
649*f6dc9357SAndroid Build Coastguard Worker     NormalizePosition();
650*f6dc9357SAndroid Build Coastguard Worker 
651*f6dc9357SAndroid Build Coastguard Worker   RestartBenchmark();
652*f6dc9357SAndroid Build Coastguard Worker 
653*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnInit();
654*f6dc9357SAndroid Build Coastguard Worker }
655*f6dc9357SAndroid Build Coastguard Worker 
656*f6dc9357SAndroid Build Coastguard Worker 
OnSize(WPARAM,int xSize,int ySize)657*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize)
658*f6dc9357SAndroid Build Coastguard Worker {
659*f6dc9357SAndroid Build Coastguard Worker   int mx, my;
660*f6dc9357SAndroid Build Coastguard Worker   GetMargins(8, mx, my);
661*f6dc9357SAndroid Build Coastguard Worker 
662*f6dc9357SAndroid Build Coastguard Worker   if (!TotalMode)
663*f6dc9357SAndroid Build Coastguard Worker   {
664*f6dc9357SAndroid Build Coastguard Worker     RECT rect;
665*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDT_BENCH_LOG, rect);
666*f6dc9357SAndroid Build Coastguard Worker     int x = xSize - rect.left - mx;
667*f6dc9357SAndroid Build Coastguard Worker     int y = ySize - rect.top - my;
668*f6dc9357SAndroid Build Coastguard Worker     if (x < 0) x = 0;
669*f6dc9357SAndroid Build Coastguard Worker     if (y < 0) y = 0;
670*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDT_BENCH_LOG, rect.left, rect.top, x, y, true);
671*f6dc9357SAndroid Build Coastguard Worker     return false;
672*f6dc9357SAndroid Build Coastguard Worker   }
673*f6dc9357SAndroid Build Coastguard Worker 
674*f6dc9357SAndroid Build Coastguard Worker   int bx1, bx2, by;
675*f6dc9357SAndroid Build Coastguard Worker 
676*f6dc9357SAndroid Build Coastguard Worker   GetItemSizes(IDCANCEL, bx1, by);
677*f6dc9357SAndroid Build Coastguard Worker   GetItemSizes(IDHELP, bx2, by);
678*f6dc9357SAndroid Build Coastguard Worker 
679*f6dc9357SAndroid Build Coastguard Worker   {
680*f6dc9357SAndroid Build Coastguard Worker     int y = ySize - my - by;
681*f6dc9357SAndroid Build Coastguard Worker     int x = xSize - mx - bx1;
682*f6dc9357SAndroid Build Coastguard Worker 
683*f6dc9357SAndroid Build Coastguard Worker     InvalidateRect(NULL);
684*f6dc9357SAndroid Build Coastguard Worker 
685*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDCANCEL, x, y, bx1, by);
686*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDHELP, x - mx - bx2, y, bx2, by);
687*f6dc9357SAndroid Build Coastguard Worker   }
688*f6dc9357SAndroid Build Coastguard Worker 
689*f6dc9357SAndroid Build Coastguard Worker   if (_consoleEdit)
690*f6dc9357SAndroid Build Coastguard Worker   {
691*f6dc9357SAndroid Build Coastguard Worker     int yPos = ySize - my - by;
692*f6dc9357SAndroid Build Coastguard Worker     RECT rect;
693*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDE_BENCH2_EDIT, rect);
694*f6dc9357SAndroid Build Coastguard Worker     int y = rect.top;
695*f6dc9357SAndroid Build Coastguard Worker     int ySize2 = yPos - my - y;
696*f6dc9357SAndroid Build Coastguard Worker     const int kMinYSize = 20;
697*f6dc9357SAndroid Build Coastguard Worker     int xx = xSize - mx * 2;
698*f6dc9357SAndroid Build Coastguard Worker     if (ySize2 < kMinYSize)
699*f6dc9357SAndroid Build Coastguard Worker     {
700*f6dc9357SAndroid Build Coastguard Worker       ySize2 = kMinYSize;
701*f6dc9357SAndroid Build Coastguard Worker     }
702*f6dc9357SAndroid Build Coastguard Worker     _consoleEdit.Move(mx, y, xx, ySize2);
703*f6dc9357SAndroid Build Coastguard Worker   }
704*f6dc9357SAndroid Build Coastguard Worker   return false;
705*f6dc9357SAndroid Build Coastguard Worker }
706*f6dc9357SAndroid Build Coastguard Worker 
707*f6dc9357SAndroid Build Coastguard Worker 
GetNumberOfThreads()708*f6dc9357SAndroid Build Coastguard Worker UInt32 CBenchmarkDialog::GetNumberOfThreads()
709*f6dc9357SAndroid Build Coastguard Worker {
710*f6dc9357SAndroid Build Coastguard Worker   return (UInt32)m_NumThreads.GetItemData_of_CurSel();
711*f6dc9357SAndroid Build Coastguard Worker }
712*f6dc9357SAndroid Build Coastguard Worker 
713*f6dc9357SAndroid Build Coastguard Worker 
714*f6dc9357SAndroid Build Coastguard Worker #define UINT_TO_STR_3(s, val) { \
715*f6dc9357SAndroid Build Coastguard Worker   s[0] = (wchar_t)('0' + (val) / 100); \
716*f6dc9357SAndroid Build Coastguard Worker   s[1] = (wchar_t)('0' + (val) % 100 / 10); \
717*f6dc9357SAndroid Build Coastguard Worker   s[2] = (wchar_t)('0' + (val) % 10); \
718*f6dc9357SAndroid Build Coastguard Worker   s += 3; s[0] = 0; }
719*f6dc9357SAndroid Build Coastguard Worker 
NumberToDot3(UInt64 val,WCHAR * s)720*f6dc9357SAndroid Build Coastguard Worker static WCHAR *NumberToDot3(UInt64 val, WCHAR *s)
721*f6dc9357SAndroid Build Coastguard Worker {
722*f6dc9357SAndroid Build Coastguard Worker   s = ConvertUInt64ToString(val / 1000, s);
723*f6dc9357SAndroid Build Coastguard Worker   const UInt32 rem = (UInt32)(val % 1000);
724*f6dc9357SAndroid Build Coastguard Worker   *s++ = '.';
725*f6dc9357SAndroid Build Coastguard Worker   UINT_TO_STR_3(s, rem)
726*f6dc9357SAndroid Build Coastguard Worker   return s;
727*f6dc9357SAndroid Build Coastguard Worker }
728*f6dc9357SAndroid Build Coastguard Worker 
SetItemText_Number(unsigned itemID,UInt64 val,LPCTSTR post)729*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::SetItemText_Number(unsigned itemID, UInt64 val, LPCTSTR post)
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker   TCHAR s[64];
732*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(val, s);
733*f6dc9357SAndroid Build Coastguard Worker   if (post)
734*f6dc9357SAndroid Build Coastguard Worker     lstrcat(s, post);
735*f6dc9357SAndroid Build Coastguard Worker   SetItemText(itemID, s);
736*f6dc9357SAndroid Build Coastguard Worker }
737*f6dc9357SAndroid Build Coastguard Worker 
AddSize_MB(UString & s,UInt64 size)738*f6dc9357SAndroid Build Coastguard Worker static void AddSize_MB(UString &s, UInt64 size)
739*f6dc9357SAndroid Build Coastguard Worker {
740*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64((size + (1 << 20) - 1) >> 20);
741*f6dc9357SAndroid Build Coastguard Worker   s += kMB;
742*f6dc9357SAndroid Build Coastguard Worker }
743*f6dc9357SAndroid Build Coastguard Worker 
Print_MemUsage(UString & s,UInt64 memUsage) const744*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::Print_MemUsage(UString &s, UInt64 memUsage) const
745*f6dc9357SAndroid Build Coastguard Worker {
746*f6dc9357SAndroid Build Coastguard Worker   AddSize_MB(s, memUsage);
747*f6dc9357SAndroid Build Coastguard Worker   if (RamSize_Defined)
748*f6dc9357SAndroid Build Coastguard Worker   {
749*f6dc9357SAndroid Build Coastguard Worker     s += " / ";
750*f6dc9357SAndroid Build Coastguard Worker     AddSize_MB(s, RamSize);
751*f6dc9357SAndroid Build Coastguard Worker   }
752*f6dc9357SAndroid Build Coastguard Worker }
753*f6dc9357SAndroid Build Coastguard Worker 
OnChangeDictionary()754*f6dc9357SAndroid Build Coastguard Worker size_t CBenchmarkDialog::OnChangeDictionary()
755*f6dc9357SAndroid Build Coastguard Worker {
756*f6dc9357SAndroid Build Coastguard Worker   const size_t dict = (size_t)m_Dictionary.GetItemData_of_CurSel();
757*f6dc9357SAndroid Build Coastguard Worker   const UInt64 memUsage = GetBenchMemoryUsage(GetNumberOfThreads(),
758*f6dc9357SAndroid Build Coastguard Worker       Sync.Level,
759*f6dc9357SAndroid Build Coastguard Worker       dict,
760*f6dc9357SAndroid Build Coastguard Worker       false); // totalBench mode
761*f6dc9357SAndroid Build Coastguard Worker 
762*f6dc9357SAndroid Build Coastguard Worker   UString s;
763*f6dc9357SAndroid Build Coastguard Worker   Print_MemUsage(s, memUsage);
764*f6dc9357SAndroid Build Coastguard Worker 
765*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LARGE_PAGES
766*f6dc9357SAndroid Build Coastguard Worker   {
767*f6dc9357SAndroid Build Coastguard Worker     AString s2;
768*f6dc9357SAndroid Build Coastguard Worker     Add_LargePages_String(s2);
769*f6dc9357SAndroid Build Coastguard Worker     if (!s2.IsEmpty())
770*f6dc9357SAndroid Build Coastguard Worker     {
771*f6dc9357SAndroid Build Coastguard Worker       s.Add_Space();
772*f6dc9357SAndroid Build Coastguard Worker       s += s2;
773*f6dc9357SAndroid Build Coastguard Worker     }
774*f6dc9357SAndroid Build Coastguard Worker   }
775*f6dc9357SAndroid Build Coastguard Worker   #endif
776*f6dc9357SAndroid Build Coastguard Worker 
777*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDT_BENCH_MEMORY_VAL, s);
778*f6dc9357SAndroid Build Coastguard Worker 
779*f6dc9357SAndroid Build Coastguard Worker   return dict;
780*f6dc9357SAndroid Build Coastguard Worker }
781*f6dc9357SAndroid Build Coastguard Worker 
782*f6dc9357SAndroid Build Coastguard Worker 
783*f6dc9357SAndroid Build Coastguard Worker static const UInt32 g_IDs[] =
784*f6dc9357SAndroid Build Coastguard Worker {
785*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SIZE1,
786*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SIZE2,
787*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_USAGE1,
788*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_USAGE2,
789*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SPEED1,
790*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SPEED2,
791*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RATING1,
792*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RATING2,
793*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RPU1,
794*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RPU2,
795*f6dc9357SAndroid Build Coastguard Worker 
796*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SIZE1,
797*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SIZE2,
798*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SPEED1,
799*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SPEED2,
800*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RATING1,
801*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RATING2,
802*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_USAGE1,
803*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_USAGE2,
804*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RPU1,
805*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RPU2,
806*f6dc9357SAndroid Build Coastguard Worker 
807*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_TOTAL_USAGE_VAL,
808*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_TOTAL_RATING_VAL,
809*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_TOTAL_RPU_VAL
810*f6dc9357SAndroid Build Coastguard Worker };
811*f6dc9357SAndroid Build Coastguard Worker 
812*f6dc9357SAndroid Build Coastguard Worker 
813*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Enc_1[] = {
814*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_USAGE1,
815*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SPEED1,
816*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RPU1,
817*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RATING1,
818*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SIZE1 };
819*f6dc9357SAndroid Build Coastguard Worker 
820*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Enc[] = {
821*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_USAGE2,
822*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SPEED2,
823*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RPU2,
824*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_RATING2,
825*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_COMPRESS_SIZE2 };
826*f6dc9357SAndroid Build Coastguard Worker 
827*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Dec_1[] = {
828*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_USAGE1,
829*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SPEED1,
830*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RPU1,
831*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RATING1,
832*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SIZE1 };
833*f6dc9357SAndroid Build Coastguard Worker 
834*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Dec[] = {
835*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_USAGE2,
836*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SPEED2,
837*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RPU2,
838*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_RATING2,
839*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_DECOMPR_SIZE2 };
840*f6dc9357SAndroid Build Coastguard Worker 
841*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Tot[] = {
842*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_TOTAL_USAGE_VAL,
843*f6dc9357SAndroid Build Coastguard Worker   0,
844*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_TOTAL_RPU_VAL,
845*f6dc9357SAndroid Build Coastguard Worker   IDT_BENCH_TOTAL_RATING_VAL,
846*f6dc9357SAndroid Build Coastguard Worker   0 };
847*f6dc9357SAndroid Build Coastguard Worker 
848*f6dc9357SAndroid Build Coastguard Worker 
MyKillTimer()849*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::MyKillTimer()
850*f6dc9357SAndroid Build Coastguard Worker {
851*f6dc9357SAndroid Build Coastguard Worker   if (_timer != 0)
852*f6dc9357SAndroid Build Coastguard Worker   {
853*f6dc9357SAndroid Build Coastguard Worker     KillTimer(kTimerID);
854*f6dc9357SAndroid Build Coastguard Worker     _timer = 0;
855*f6dc9357SAndroid Build Coastguard Worker   }
856*f6dc9357SAndroid Build Coastguard Worker }
857*f6dc9357SAndroid Build Coastguard Worker 
858*f6dc9357SAndroid Build Coastguard Worker 
OnDestroy()859*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnDestroy()
860*f6dc9357SAndroid Build Coastguard Worker {
861*f6dc9357SAndroid Build Coastguard Worker   /* actually timer was removed before.
862*f6dc9357SAndroid Build Coastguard Worker      also the timer must be removed by Windows, when window  will be removed. */
863*f6dc9357SAndroid Build Coastguard Worker   MyKillTimer(); // it's optional code
864*f6dc9357SAndroid Build Coastguard Worker   return false; // we return (false) to perform default dialog operation
865*f6dc9357SAndroid Build Coastguard Worker }
866*f6dc9357SAndroid Build Coastguard Worker 
867*f6dc9357SAndroid Build Coastguard Worker void SetErrorMessage_MemUsage(UString &s, UInt64 reqSize, UInt64 ramSize, UInt64 ramLimit, const UString &usageString);
868*f6dc9357SAndroid Build Coastguard Worker 
StartBenchmark()869*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::StartBenchmark()
870*f6dc9357SAndroid Build Coastguard Worker {
871*f6dc9357SAndroid Build Coastguard Worker   NeedRestart = false;
872*f6dc9357SAndroid Build Coastguard Worker   WasStopped_in_GUI = false;
873*f6dc9357SAndroid Build Coastguard Worker 
874*f6dc9357SAndroid Build Coastguard Worker   SetItemText_Empty(IDT_BENCH_ERROR_MESSAGE);
875*f6dc9357SAndroid Build Coastguard Worker 
876*f6dc9357SAndroid Build Coastguard Worker   MyKillTimer(); // optional code. timer was killed before
877*f6dc9357SAndroid Build Coastguard Worker 
878*f6dc9357SAndroid Build Coastguard Worker   const size_t dict = OnChangeDictionary();
879*f6dc9357SAndroid Build Coastguard Worker   const UInt32 numThreads = GetNumberOfThreads();
880*f6dc9357SAndroid Build Coastguard Worker   const UInt32 numPasses = (UInt32)m_NumPasses.GetItemData_of_CurSel();
881*f6dc9357SAndroid Build Coastguard Worker 
882*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_IDs); i++)
883*f6dc9357SAndroid Build Coastguard Worker     SetItemText(g_IDs[i], kProcessingString);
884*f6dc9357SAndroid Build Coastguard Worker 
885*f6dc9357SAndroid Build Coastguard Worker   SetItemText_Empty(IDT_BENCH_LOG);
886*f6dc9357SAndroid Build Coastguard Worker   SetItemText_Empty(IDT_BENCH_ELAPSED_VAL);
887*f6dc9357SAndroid Build Coastguard Worker   SetItemText_Empty(IDT_BENCH_ERROR_MESSAGE);
888*f6dc9357SAndroid Build Coastguard Worker 
889*f6dc9357SAndroid Build Coastguard Worker   const UInt64 memUsage = GetBenchMemoryUsage(numThreads, Sync.Level, dict,
890*f6dc9357SAndroid Build Coastguard Worker       false); // totalBench
891*f6dc9357SAndroid Build Coastguard Worker   if (!IsMemoryUsageOK(memUsage))
892*f6dc9357SAndroid Build Coastguard Worker   {
893*f6dc9357SAndroid Build Coastguard Worker     UString s2;
894*f6dc9357SAndroid Build Coastguard Worker     LangString_OnlyFromLangFile(IDS_MEM_REQUIRED_MEM_SIZE, s2);
895*f6dc9357SAndroid Build Coastguard Worker     if (s2.IsEmpty())
896*f6dc9357SAndroid Build Coastguard Worker     {
897*f6dc9357SAndroid Build Coastguard Worker       s2 = LangString(IDT_BENCH_MEMORY);
898*f6dc9357SAndroid Build Coastguard Worker       if (s2.IsEmpty())
899*f6dc9357SAndroid Build Coastguard Worker         GetItemText(IDT_BENCH_MEMORY, s2);
900*f6dc9357SAndroid Build Coastguard Worker       s2.RemoveChar(L':');
901*f6dc9357SAndroid Build Coastguard Worker     }
902*f6dc9357SAndroid Build Coastguard Worker     UString s;
903*f6dc9357SAndroid Build Coastguard Worker     SetErrorMessage_MemUsage(s, memUsage, RamSize, RamSize_Limit, s2);
904*f6dc9357SAndroid Build Coastguard Worker     MessageBoxError_Status(s);
905*f6dc9357SAndroid Build Coastguard Worker     return;
906*f6dc9357SAndroid Build Coastguard Worker   }
907*f6dc9357SAndroid Build Coastguard Worker 
908*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDB_STOP, true);
909*f6dc9357SAndroid Build Coastguard Worker 
910*f6dc9357SAndroid Build Coastguard Worker   _startTime = GetTickCount();
911*f6dc9357SAndroid Build Coastguard Worker   _finishTime = _startTime;
912*f6dc9357SAndroid Build Coastguard Worker   _finishTime_WasSet = false;
913*f6dc9357SAndroid Build Coastguard Worker 
914*f6dc9357SAndroid Build Coastguard Worker   {
915*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS);
916*f6dc9357SAndroid Build Coastguard Worker     InitSyncNew();
917*f6dc9357SAndroid Build Coastguard Worker     Sync.DictSize = dict;
918*f6dc9357SAndroid Build Coastguard Worker     Sync.NumThreads = numThreads;
919*f6dc9357SAndroid Build Coastguard Worker     Sync.NumPasses_Limit = numPasses;
920*f6dc9357SAndroid Build Coastguard Worker   }
921*f6dc9357SAndroid Build Coastguard Worker 
922*f6dc9357SAndroid Build Coastguard Worker   PrintTime();
923*f6dc9357SAndroid Build Coastguard Worker 
924*f6dc9357SAndroid Build Coastguard Worker   _timer = SetTimer(kTimerID, kTimerElapse);
925*f6dc9357SAndroid Build Coastguard Worker   if (_thread.Create(CThreadBenchmark::MyThreadFunction, &_threadBenchmark) != 0)
926*f6dc9357SAndroid Build Coastguard Worker   {
927*f6dc9357SAndroid Build Coastguard Worker     MyKillTimer();
928*f6dc9357SAndroid Build Coastguard Worker     MessageBoxError_Status(L"Can't create thread");
929*f6dc9357SAndroid Build Coastguard Worker   }
930*f6dc9357SAndroid Build Coastguard Worker   return;
931*f6dc9357SAndroid Build Coastguard Worker }
932*f6dc9357SAndroid Build Coastguard Worker 
933*f6dc9357SAndroid Build Coastguard Worker 
RestartBenchmark()934*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::RestartBenchmark()
935*f6dc9357SAndroid Build Coastguard Worker {
936*f6dc9357SAndroid Build Coastguard Worker   if (ExitWasAsked_in_GUI)
937*f6dc9357SAndroid Build Coastguard Worker     return;
938*f6dc9357SAndroid Build Coastguard Worker 
939*f6dc9357SAndroid Build Coastguard Worker   if (_thread.IsCreated())
940*f6dc9357SAndroid Build Coastguard Worker   {
941*f6dc9357SAndroid Build Coastguard Worker     NeedRestart = true;
942*f6dc9357SAndroid Build Coastguard Worker     SendExit_Status(L"Stop for restart ...");
943*f6dc9357SAndroid Build Coastguard Worker   }
944*f6dc9357SAndroid Build Coastguard Worker   else
945*f6dc9357SAndroid Build Coastguard Worker     StartBenchmark();
946*f6dc9357SAndroid Build Coastguard Worker }
947*f6dc9357SAndroid Build Coastguard Worker 
948*f6dc9357SAndroid Build Coastguard Worker 
Disable_Stop_Button()949*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::Disable_Stop_Button()
950*f6dc9357SAndroid Build Coastguard Worker {
951*f6dc9357SAndroid Build Coastguard Worker   // if we disable focused button, then focus will be lost
952*f6dc9357SAndroid Build Coastguard Worker   if (GetFocus() == GetItem(IDB_STOP))
953*f6dc9357SAndroid Build Coastguard Worker   {
954*f6dc9357SAndroid Build Coastguard Worker     // SendMsg_NextDlgCtl_Prev();
955*f6dc9357SAndroid Build Coastguard Worker     SendMsg_NextDlgCtl_CtlId(IDB_RESTART);
956*f6dc9357SAndroid Build Coastguard Worker   }
957*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDB_STOP, false);
958*f6dc9357SAndroid Build Coastguard Worker }
959*f6dc9357SAndroid Build Coastguard Worker 
960*f6dc9357SAndroid Build Coastguard Worker 
OnStopButton()961*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::OnStopButton()
962*f6dc9357SAndroid Build Coastguard Worker {
963*f6dc9357SAndroid Build Coastguard Worker   if (ExitWasAsked_in_GUI)
964*f6dc9357SAndroid Build Coastguard Worker     return;
965*f6dc9357SAndroid Build Coastguard Worker 
966*f6dc9357SAndroid Build Coastguard Worker   Disable_Stop_Button();
967*f6dc9357SAndroid Build Coastguard Worker 
968*f6dc9357SAndroid Build Coastguard Worker   WasStopped_in_GUI = true;
969*f6dc9357SAndroid Build Coastguard Worker   if (_thread.IsCreated())
970*f6dc9357SAndroid Build Coastguard Worker   {
971*f6dc9357SAndroid Build Coastguard Worker     SendExit_Status(L"Stop ...");
972*f6dc9357SAndroid Build Coastguard Worker   }
973*f6dc9357SAndroid Build Coastguard Worker }
974*f6dc9357SAndroid Build Coastguard Worker 
975*f6dc9357SAndroid Build Coastguard Worker 
976*f6dc9357SAndroid Build Coastguard Worker 
OnCancel()977*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::OnCancel()
978*f6dc9357SAndroid Build Coastguard Worker {
979*f6dc9357SAndroid Build Coastguard Worker   ExitWasAsked_in_GUI = true;
980*f6dc9357SAndroid Build Coastguard Worker 
981*f6dc9357SAndroid Build Coastguard Worker   /*
982*f6dc9357SAndroid Build Coastguard Worker   SendMsg_NextDlgCtl_Prev();
983*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDCANCEL, false);
984*f6dc9357SAndroid Build Coastguard Worker   */
985*f6dc9357SAndroid Build Coastguard Worker 
986*f6dc9357SAndroid Build Coastguard Worker   if (_thread.IsCreated())
987*f6dc9357SAndroid Build Coastguard Worker     SendExit_Status(L"Cancel ...");
988*f6dc9357SAndroid Build Coastguard Worker   else
989*f6dc9357SAndroid Build Coastguard Worker     CModalDialog::OnCancel();
990*f6dc9357SAndroid Build Coastguard Worker }
991*f6dc9357SAndroid Build Coastguard Worker 
992*f6dc9357SAndroid Build Coastguard Worker 
OnHelp()993*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::OnHelp()
994*f6dc9357SAndroid Build Coastguard Worker {
995*f6dc9357SAndroid Build Coastguard Worker   ShowHelpWindow(kHelpTopic);
996*f6dc9357SAndroid Build Coastguard Worker }
997*f6dc9357SAndroid Build Coastguard Worker 
998*f6dc9357SAndroid Build Coastguard Worker 
999*f6dc9357SAndroid Build Coastguard Worker 
1000*f6dc9357SAndroid Build Coastguard Worker // void GetTimeString(UInt64 timeValue, wchar_t *s);
1001*f6dc9357SAndroid Build Coastguard Worker 
PrintTime()1002*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintTime()
1003*f6dc9357SAndroid Build Coastguard Worker {
1004*f6dc9357SAndroid Build Coastguard Worker   const UInt32 curTime =
1005*f6dc9357SAndroid Build Coastguard Worker     _finishTime_WasSet ?
1006*f6dc9357SAndroid Build Coastguard Worker       _finishTime :
1007*f6dc9357SAndroid Build Coastguard Worker       ::GetTickCount();
1008*f6dc9357SAndroid Build Coastguard Worker 
1009*f6dc9357SAndroid Build Coastguard Worker   const UInt32 elapsedTime = (curTime - _startTime);
1010*f6dc9357SAndroid Build Coastguard Worker 
1011*f6dc9357SAndroid Build Coastguard Worker   WCHAR s[64];
1012*f6dc9357SAndroid Build Coastguard Worker 
1013*f6dc9357SAndroid Build Coastguard Worker   WCHAR *p = ConvertUInt32ToString(elapsedTime / 1000, s);
1014*f6dc9357SAndroid Build Coastguard Worker 
1015*f6dc9357SAndroid Build Coastguard Worker   if (_finishTime_WasSet)
1016*f6dc9357SAndroid Build Coastguard Worker   {
1017*f6dc9357SAndroid Build Coastguard Worker     *p++ = '.';
1018*f6dc9357SAndroid Build Coastguard Worker     UINT_TO_STR_3(p, elapsedTime % 1000)
1019*f6dc9357SAndroid Build Coastguard Worker   }
1020*f6dc9357SAndroid Build Coastguard Worker 
1021*f6dc9357SAndroid Build Coastguard Worker   // p = NumberToDot3((UInt64)elapsedTime, s);
1022*f6dc9357SAndroid Build Coastguard Worker 
1023*f6dc9357SAndroid Build Coastguard Worker   MyStringCopy(p, L" s");
1024*f6dc9357SAndroid Build Coastguard Worker 
1025*f6dc9357SAndroid Build Coastguard Worker   // if (WasStopped_in_GUI) wcscat(s, L" X"); // for debug
1026*f6dc9357SAndroid Build Coastguard Worker 
1027*f6dc9357SAndroid Build Coastguard Worker   if (s == ElapsedSec_Prev)
1028*f6dc9357SAndroid Build Coastguard Worker     return;
1029*f6dc9357SAndroid Build Coastguard Worker 
1030*f6dc9357SAndroid Build Coastguard Worker   ElapsedSec_Prev = s;
1031*f6dc9357SAndroid Build Coastguard Worker 
1032*f6dc9357SAndroid Build Coastguard Worker   // static cnt = 0; cnt++; wcscat(s, L" ");
1033*f6dc9357SAndroid Build Coastguard Worker   // UString s2; s2.Add_UInt32(cnt); wcscat(s, s2.Ptr());
1034*f6dc9357SAndroid Build Coastguard Worker 
1035*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDT_BENCH_ELAPSED_VAL, s);
1036*f6dc9357SAndroid Build Coastguard Worker }
1037*f6dc9357SAndroid Build Coastguard Worker 
1038*f6dc9357SAndroid Build Coastguard Worker 
GetMips(UInt64 ips)1039*f6dc9357SAndroid Build Coastguard Worker static UInt64 GetMips(UInt64 ips)
1040*f6dc9357SAndroid Build Coastguard Worker {
1041*f6dc9357SAndroid Build Coastguard Worker   return (ips + 500000) / 1000000;
1042*f6dc9357SAndroid Build Coastguard Worker }
1043*f6dc9357SAndroid Build Coastguard Worker 
1044*f6dc9357SAndroid Build Coastguard Worker 
GetUsagePercents(UInt64 usage)1045*f6dc9357SAndroid Build Coastguard Worker static UInt64 GetUsagePercents(UInt64 usage)
1046*f6dc9357SAndroid Build Coastguard Worker {
1047*f6dc9357SAndroid Build Coastguard Worker   return Benchmark_GetUsage_Percents(usage);
1048*f6dc9357SAndroid Build Coastguard Worker }
1049*f6dc9357SAndroid Build Coastguard Worker 
1050*f6dc9357SAndroid Build Coastguard Worker 
GetRating(const CTotalBenchRes & info)1051*f6dc9357SAndroid Build Coastguard Worker static UInt32 GetRating(const CTotalBenchRes &info)
1052*f6dc9357SAndroid Build Coastguard Worker {
1053*f6dc9357SAndroid Build Coastguard Worker   UInt64 numIter = info.NumIterations2;
1054*f6dc9357SAndroid Build Coastguard Worker   if (numIter == 0)
1055*f6dc9357SAndroid Build Coastguard Worker     numIter = 1000000;
1056*f6dc9357SAndroid Build Coastguard Worker   const UInt64 rating64 = GetMips(info.Rating / numIter);
1057*f6dc9357SAndroid Build Coastguard Worker   // return rating64;
1058*f6dc9357SAndroid Build Coastguard Worker   UInt32 rating32 = (UInt32)rating64;
1059*f6dc9357SAndroid Build Coastguard Worker   if (rating32 != rating64)
1060*f6dc9357SAndroid Build Coastguard Worker     rating32 = (UInt32)(Int32)-1;
1061*f6dc9357SAndroid Build Coastguard Worker   return rating32;
1062*f6dc9357SAndroid Build Coastguard Worker }
1063*f6dc9357SAndroid Build Coastguard Worker 
1064*f6dc9357SAndroid Build Coastguard Worker 
AddUsageString(UString & s,const CTotalBenchRes & info)1065*f6dc9357SAndroid Build Coastguard Worker static void AddUsageString(UString &s, const CTotalBenchRes &info)
1066*f6dc9357SAndroid Build Coastguard Worker {
1067*f6dc9357SAndroid Build Coastguard Worker   UInt64 numIter = info.NumIterations2;
1068*f6dc9357SAndroid Build Coastguard Worker   if (numIter == 0)
1069*f6dc9357SAndroid Build Coastguard Worker     numIter = 1000000;
1070*f6dc9357SAndroid Build Coastguard Worker   UInt64 usage = GetUsagePercents(info.Usage / numIter);
1071*f6dc9357SAndroid Build Coastguard Worker 
1072*f6dc9357SAndroid Build Coastguard Worker   wchar_t w[64];
1073*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(usage, w);
1074*f6dc9357SAndroid Build Coastguard Worker   unsigned len = MyStringLen(w);
1075*f6dc9357SAndroid Build Coastguard Worker   while (len < 5)
1076*f6dc9357SAndroid Build Coastguard Worker   {
1077*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
1078*f6dc9357SAndroid Build Coastguard Worker     len++;
1079*f6dc9357SAndroid Build Coastguard Worker   }
1080*f6dc9357SAndroid Build Coastguard Worker   s += w;
1081*f6dc9357SAndroid Build Coastguard Worker   s += "%";
1082*f6dc9357SAndroid Build Coastguard Worker }
1083*f6dc9357SAndroid Build Coastguard Worker 
1084*f6dc9357SAndroid Build Coastguard Worker 
Add_Dot3String(UString & s,UInt64 val)1085*f6dc9357SAndroid Build Coastguard Worker static void Add_Dot3String(UString &s, UInt64 val)
1086*f6dc9357SAndroid Build Coastguard Worker {
1087*f6dc9357SAndroid Build Coastguard Worker   WCHAR temp[32];
1088*f6dc9357SAndroid Build Coastguard Worker   NumberToDot3(val, temp);
1089*f6dc9357SAndroid Build Coastguard Worker   s += temp;
1090*f6dc9357SAndroid Build Coastguard Worker }
1091*f6dc9357SAndroid Build Coastguard Worker 
1092*f6dc9357SAndroid Build Coastguard Worker 
AddRatingString(UString & s,const CTotalBenchRes & info)1093*f6dc9357SAndroid Build Coastguard Worker static void AddRatingString(UString &s, const CTotalBenchRes &info)
1094*f6dc9357SAndroid Build Coastguard Worker {
1095*f6dc9357SAndroid Build Coastguard Worker   // AddUsageString(s, info);
1096*f6dc9357SAndroid Build Coastguard Worker   // s.Add_Space();
1097*f6dc9357SAndroid Build Coastguard Worker   // s.Add_UInt32(GetRating(info));
1098*f6dc9357SAndroid Build Coastguard Worker   Add_Dot3String(s, GetRating(info));
1099*f6dc9357SAndroid Build Coastguard Worker }
1100*f6dc9357SAndroid Build Coastguard Worker 
1101*f6dc9357SAndroid Build Coastguard Worker 
AddRatingsLine(UString & s,const CTotalBenchRes & enc,const CTotalBenchRes & dec,DWORD ticks)1102*f6dc9357SAndroid Build Coastguard Worker static void AddRatingsLine(UString &s, const CTotalBenchRes &enc, const CTotalBenchRes &dec
1103*f6dc9357SAndroid Build Coastguard Worker     #ifdef PRINT_ITER_TIME
1104*f6dc9357SAndroid Build Coastguard Worker     , DWORD ticks
1105*f6dc9357SAndroid Build Coastguard Worker     #endif
1106*f6dc9357SAndroid Build Coastguard Worker     )
1107*f6dc9357SAndroid Build Coastguard Worker {
1108*f6dc9357SAndroid Build Coastguard Worker   // AddUsageString(s, enc); s.Add_Space();
1109*f6dc9357SAndroid Build Coastguard Worker 
1110*f6dc9357SAndroid Build Coastguard Worker   AddRatingString(s, enc);
1111*f6dc9357SAndroid Build Coastguard Worker   s += "  ";
1112*f6dc9357SAndroid Build Coastguard Worker   AddRatingString(s, dec);
1113*f6dc9357SAndroid Build Coastguard Worker 
1114*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes tot_BenchRes;
1115*f6dc9357SAndroid Build Coastguard Worker   tot_BenchRes.SetSum(enc, dec);
1116*f6dc9357SAndroid Build Coastguard Worker 
1117*f6dc9357SAndroid Build Coastguard Worker   s += "  ";
1118*f6dc9357SAndroid Build Coastguard Worker   AddRatingString(s, tot_BenchRes);
1119*f6dc9357SAndroid Build Coastguard Worker 
1120*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();  AddUsageString(s, tot_BenchRes);
1121*f6dc9357SAndroid Build Coastguard Worker 
1122*f6dc9357SAndroid Build Coastguard Worker 
1123*f6dc9357SAndroid Build Coastguard Worker   #ifdef PRINT_ITER_TIME
1124*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();
1125*f6dc9357SAndroid Build Coastguard Worker   {
1126*f6dc9357SAndroid Build Coastguard Worker     Add_Dot3String(s, ticks;
1127*f6dc9357SAndroid Build Coastguard Worker     s += " s";
1128*f6dc9357SAndroid Build Coastguard Worker     // s.Add_UInt32(ticks); s += " ms";
1129*f6dc9357SAndroid Build Coastguard Worker   }
1130*f6dc9357SAndroid Build Coastguard Worker   #endif
1131*f6dc9357SAndroid Build Coastguard Worker }
1132*f6dc9357SAndroid Build Coastguard Worker 
1133*f6dc9357SAndroid Build Coastguard Worker 
1134*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintRating(UInt64 rating, UINT controlID)
1135*f6dc9357SAndroid Build Coastguard Worker {
1136*f6dc9357SAndroid Build Coastguard Worker   // SetItemText_Number(controlID, GetMips(rating), kMIPS);
1137*f6dc9357SAndroid Build Coastguard Worker   WCHAR s[64];
1138*f6dc9357SAndroid Build Coastguard Worker   MyStringCopy(NumberToDot3(GetMips(rating), s), L" GIPS");
1139*f6dc9357SAndroid Build Coastguard Worker   SetItemText(controlID, s);
1140*f6dc9357SAndroid Build Coastguard Worker }
1141*f6dc9357SAndroid Build Coastguard Worker 
1142*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintUsage(UInt64 usage, UINT controlID)
1143*f6dc9357SAndroid Build Coastguard Worker {
1144*f6dc9357SAndroid Build Coastguard Worker   SetItemText_Number(controlID, GetUsagePercents(usage), TEXT("%"));
1145*f6dc9357SAndroid Build Coastguard Worker }
1146*f6dc9357SAndroid Build Coastguard Worker 
1147*f6dc9357SAndroid Build Coastguard Worker 
1148*f6dc9357SAndroid Build Coastguard Worker // void SetItemText_Number
1149*f6dc9357SAndroid Build Coastguard Worker 
1150*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintBenchRes(
1151*f6dc9357SAndroid Build Coastguard Worker     const CTotalBenchRes2 &info,
1152*f6dc9357SAndroid Build Coastguard Worker     const UINT ids[])
1153*f6dc9357SAndroid Build Coastguard Worker {
1154*f6dc9357SAndroid Build Coastguard Worker   if (info.NumIterations2 == 0)
1155*f6dc9357SAndroid Build Coastguard Worker     return;
1156*f6dc9357SAndroid Build Coastguard Worker   if (ids[1] != 0)
1157*f6dc9357SAndroid Build Coastguard Worker     SetItemText_Number(ids[1], (info.Speed >> 10) / info.NumIterations2, kKBs);
1158*f6dc9357SAndroid Build Coastguard Worker   PrintRating(info.Rating / info.NumIterations2, ids[3]);
1159*f6dc9357SAndroid Build Coastguard Worker   PrintRating(info.RPU / info.NumIterations2, ids[2]);
1160*f6dc9357SAndroid Build Coastguard Worker   PrintUsage(info.Usage / info.NumIterations2, ids[0]);
1161*f6dc9357SAndroid Build Coastguard Worker   if (ids[4] != 0)
1162*f6dc9357SAndroid Build Coastguard Worker   {
1163*f6dc9357SAndroid Build Coastguard Worker     UInt64 val = info.UnpackSize;
1164*f6dc9357SAndroid Build Coastguard Worker     LPCTSTR kPostfix;
1165*f6dc9357SAndroid Build Coastguard Worker     if (val >= ((UInt64)1 << 40))
1166*f6dc9357SAndroid Build Coastguard Worker     {
1167*f6dc9357SAndroid Build Coastguard Worker       kPostfix = kGB;
1168*f6dc9357SAndroid Build Coastguard Worker       val >>= 30;
1169*f6dc9357SAndroid Build Coastguard Worker     }
1170*f6dc9357SAndroid Build Coastguard Worker     else
1171*f6dc9357SAndroid Build Coastguard Worker     {
1172*f6dc9357SAndroid Build Coastguard Worker       kPostfix = kMB;
1173*f6dc9357SAndroid Build Coastguard Worker       val >>= 20;
1174*f6dc9357SAndroid Build Coastguard Worker     }
1175*f6dc9357SAndroid Build Coastguard Worker     SetItemText_Number(ids[4], val, kPostfix);
1176*f6dc9357SAndroid Build Coastguard Worker   }
1177*f6dc9357SAndroid Build Coastguard Worker }
1178*f6dc9357SAndroid Build Coastguard Worker 
1179*f6dc9357SAndroid Build Coastguard Worker 
1180*f6dc9357SAndroid Build Coastguard Worker // static UInt32 k_Message_Finished_cnt = 0;
1181*f6dc9357SAndroid Build Coastguard Worker // static UInt32 k_OnTimer_cnt = 0;
1182*f6dc9357SAndroid Build Coastguard Worker 
1183*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
1184*f6dc9357SAndroid Build Coastguard Worker {
1185*f6dc9357SAndroid Build Coastguard Worker   if (message != k_Message_Finished)
1186*f6dc9357SAndroid Build Coastguard Worker     return CModalDialog::OnMessage(message, wParam, lParam);
1187*f6dc9357SAndroid Build Coastguard Worker 
1188*f6dc9357SAndroid Build Coastguard Worker   {
1189*f6dc9357SAndroid Build Coastguard Worker     if (wParam == k_Msg_WPARM_Thread_Finished)
1190*f6dc9357SAndroid Build Coastguard Worker     {
1191*f6dc9357SAndroid Build Coastguard Worker       _finishTime = GetTickCount();
1192*f6dc9357SAndroid Build Coastguard Worker       _finishTime_WasSet = true;
1193*f6dc9357SAndroid Build Coastguard Worker       MyKillTimer();
1194*f6dc9357SAndroid Build Coastguard Worker 
1195*f6dc9357SAndroid Build Coastguard Worker       if (_thread.Wait_Close() != 0)
1196*f6dc9357SAndroid Build Coastguard Worker       {
1197*f6dc9357SAndroid Build Coastguard Worker         MessageBoxError_Status(L"Thread Wait Error");
1198*f6dc9357SAndroid Build Coastguard Worker       }
1199*f6dc9357SAndroid Build Coastguard Worker 
1200*f6dc9357SAndroid Build Coastguard Worker       if (!WasStopped_in_GUI)
1201*f6dc9357SAndroid Build Coastguard Worker       {
1202*f6dc9357SAndroid Build Coastguard Worker         WasStopped_in_GUI = true;
1203*f6dc9357SAndroid Build Coastguard Worker         Disable_Stop_Button();
1204*f6dc9357SAndroid Build Coastguard Worker       }
1205*f6dc9357SAndroid Build Coastguard Worker 
1206*f6dc9357SAndroid Build Coastguard Worker       HRESULT res = Sync.BenchFinish_Thread_HRESULT;
1207*f6dc9357SAndroid Build Coastguard Worker       if (res != S_OK)
1208*f6dc9357SAndroid Build Coastguard Worker       // if (!ExitWasAsked_in_GUI || res != E_ABORT)
1209*f6dc9357SAndroid Build Coastguard Worker         MessageBoxError_Status(HResultToMessage(res));
1210*f6dc9357SAndroid Build Coastguard Worker 
1211*f6dc9357SAndroid Build Coastguard Worker       if (ExitWasAsked_in_GUI)
1212*f6dc9357SAndroid Build Coastguard Worker       {
1213*f6dc9357SAndroid Build Coastguard Worker         // SetItemText(IDT_BENCH_ERROR_MESSAGE, "before CModalDialog::OnCancel()");
1214*f6dc9357SAndroid Build Coastguard Worker         // Sleep (2000);
1215*f6dc9357SAndroid Build Coastguard Worker         // MessageBoxError(L"test");
1216*f6dc9357SAndroid Build Coastguard Worker         CModalDialog::OnCancel();
1217*f6dc9357SAndroid Build Coastguard Worker         return true;
1218*f6dc9357SAndroid Build Coastguard Worker       }
1219*f6dc9357SAndroid Build Coastguard Worker 
1220*f6dc9357SAndroid Build Coastguard Worker       SetItemText_Empty(IDT_BENCH_ERROR_MESSAGE);
1221*f6dc9357SAndroid Build Coastguard Worker 
1222*f6dc9357SAndroid Build Coastguard Worker       res = Sync.BenchFinish_Task_HRESULT;
1223*f6dc9357SAndroid Build Coastguard Worker       if (res != S_OK)
1224*f6dc9357SAndroid Build Coastguard Worker       {
1225*f6dc9357SAndroid Build Coastguard Worker         if (!WasStopped_in_GUI || res != E_ABORT)
1226*f6dc9357SAndroid Build Coastguard Worker         {
1227*f6dc9357SAndroid Build Coastguard Worker           UString m;
1228*f6dc9357SAndroid Build Coastguard Worker           if (res == S_FALSE)
1229*f6dc9357SAndroid Build Coastguard Worker             m = "Decoding error";
1230*f6dc9357SAndroid Build Coastguard Worker           else if (res == CLASS_E_CLASSNOTAVAILABLE)
1231*f6dc9357SAndroid Build Coastguard Worker             m = "Can't find 7z.dll";
1232*f6dc9357SAndroid Build Coastguard Worker           else
1233*f6dc9357SAndroid Build Coastguard Worker             m = HResultToMessage(res);
1234*f6dc9357SAndroid Build Coastguard Worker           MessageBoxError_Status(m);
1235*f6dc9357SAndroid Build Coastguard Worker         }
1236*f6dc9357SAndroid Build Coastguard Worker       }
1237*f6dc9357SAndroid Build Coastguard Worker 
1238*f6dc9357SAndroid Build Coastguard Worker       if (NeedRestart)
1239*f6dc9357SAndroid Build Coastguard Worker       {
1240*f6dc9357SAndroid Build Coastguard Worker         StartBenchmark();
1241*f6dc9357SAndroid Build Coastguard Worker         return true;
1242*f6dc9357SAndroid Build Coastguard Worker       }
1243*f6dc9357SAndroid Build Coastguard Worker     }
1244*f6dc9357SAndroid Build Coastguard Worker     // k_Message_Finished_cnt++;
1245*f6dc9357SAndroid Build Coastguard Worker     UpdateGui();
1246*f6dc9357SAndroid Build Coastguard Worker     return true;
1247*f6dc9357SAndroid Build Coastguard Worker   }
1248*f6dc9357SAndroid Build Coastguard Worker }
1249*f6dc9357SAndroid Build Coastguard Worker 
1250*f6dc9357SAndroid Build Coastguard Worker 
1251*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnTimer(WPARAM timerID, LPARAM /* callback */)
1252*f6dc9357SAndroid Build Coastguard Worker {
1253*f6dc9357SAndroid Build Coastguard Worker   // k_OnTimer_cnt++;
1254*f6dc9357SAndroid Build Coastguard Worker   if (timerID == kTimerID)
1255*f6dc9357SAndroid Build Coastguard Worker     UpdateGui();
1256*f6dc9357SAndroid Build Coastguard Worker   return true;
1257*f6dc9357SAndroid Build Coastguard Worker }
1258*f6dc9357SAndroid Build Coastguard Worker 
1259*f6dc9357SAndroid Build Coastguard Worker 
1260*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::UpdateGui()
1261*f6dc9357SAndroid Build Coastguard Worker {
1262*f6dc9357SAndroid Build Coastguard Worker   PrintTime();
1263*f6dc9357SAndroid Build Coastguard Worker 
1264*f6dc9357SAndroid Build Coastguard Worker   if (TotalMode)
1265*f6dc9357SAndroid Build Coastguard Worker   {
1266*f6dc9357SAndroid Build Coastguard Worker     bool wasChanged = false;
1267*f6dc9357SAndroid Build Coastguard Worker     {
1268*f6dc9357SAndroid Build Coastguard Worker       NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS);
1269*f6dc9357SAndroid Build Coastguard Worker 
1270*f6dc9357SAndroid Build Coastguard Worker       if (Sync.TextWasChanged)
1271*f6dc9357SAndroid Build Coastguard Worker       {
1272*f6dc9357SAndroid Build Coastguard Worker         wasChanged = true;
1273*f6dc9357SAndroid Build Coastguard Worker         Bench2Text += Sync.Text;
1274*f6dc9357SAndroid Build Coastguard Worker         Sync.Text.Empty();
1275*f6dc9357SAndroid Build Coastguard Worker         Sync.TextWasChanged = false;
1276*f6dc9357SAndroid Build Coastguard Worker       }
1277*f6dc9357SAndroid Build Coastguard Worker     }
1278*f6dc9357SAndroid Build Coastguard Worker     if (wasChanged)
1279*f6dc9357SAndroid Build Coastguard Worker       _consoleEdit.SetText(Bench2Text);
1280*f6dc9357SAndroid Build Coastguard Worker     return;
1281*f6dc9357SAndroid Build Coastguard Worker   }
1282*f6dc9357SAndroid Build Coastguard Worker 
1283*f6dc9357SAndroid Build Coastguard Worker   CSyncData sd;
1284*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CBenchPassResult> RatingVector;
1285*f6dc9357SAndroid Build Coastguard Worker 
1286*f6dc9357SAndroid Build Coastguard Worker   {
1287*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS);
1288*f6dc9357SAndroid Build Coastguard Worker     sd = Sync.sd;
1289*f6dc9357SAndroid Build Coastguard Worker 
1290*f6dc9357SAndroid Build Coastguard Worker     if (sd.NeedPrint_RatingVector)
1291*f6dc9357SAndroid Build Coastguard Worker       RatingVector = Sync.RatingVector;
1292*f6dc9357SAndroid Build Coastguard Worker 
1293*f6dc9357SAndroid Build Coastguard Worker     if (sd.NeedPrint_Freq)
1294*f6dc9357SAndroid Build Coastguard Worker     {
1295*f6dc9357SAndroid Build Coastguard Worker       Sync.FreqString_GUI = Sync.FreqString_Sync;
1296*f6dc9357SAndroid Build Coastguard Worker       sd.NeedPrint_RatingVector = true;
1297*f6dc9357SAndroid Build Coastguard Worker     }
1298*f6dc9357SAndroid Build Coastguard Worker 
1299*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_RatingVector = false;
1300*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_Enc_1 = false;
1301*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_Enc   = false;
1302*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_Dec_1 = false;
1303*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_Dec   = false;
1304*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_Tot   = false;
1305*f6dc9357SAndroid Build Coastguard Worker     Sync.sd.NeedPrint_Freq = false;
1306*f6dc9357SAndroid Build Coastguard Worker   }
1307*f6dc9357SAndroid Build Coastguard Worker 
1308*f6dc9357SAndroid Build Coastguard Worker   if (sd.NumPasses_Finished != NumPasses_Finished_Prev)
1309*f6dc9357SAndroid Build Coastguard Worker   {
1310*f6dc9357SAndroid Build Coastguard Worker     SetItemText_Number(IDT_BENCH_PASSES_VAL, sd.NumPasses_Finished, TEXT(" /"));
1311*f6dc9357SAndroid Build Coastguard Worker     NumPasses_Finished_Prev = sd.NumPasses_Finished;
1312*f6dc9357SAndroid Build Coastguard Worker   }
1313*f6dc9357SAndroid Build Coastguard Worker 
1314*f6dc9357SAndroid Build Coastguard Worker   if (sd.NeedPrint_Enc_1) PrintBenchRes(sd.Enc_BenchRes_1, k_Ids_Enc_1);
1315*f6dc9357SAndroid Build Coastguard Worker   if (sd.NeedPrint_Enc)   PrintBenchRes(sd.Enc_BenchRes,   k_Ids_Enc);
1316*f6dc9357SAndroid Build Coastguard Worker   if (sd.NeedPrint_Dec_1) PrintBenchRes(sd.Dec_BenchRes_1, k_Ids_Dec_1);
1317*f6dc9357SAndroid Build Coastguard Worker   if (sd.NeedPrint_Dec)   PrintBenchRes(sd.Dec_BenchRes,   k_Ids_Dec);
1318*f6dc9357SAndroid Build Coastguard Worker 
1319*f6dc9357SAndroid Build Coastguard Worker   if (sd.BenchWasFinished && sd.NeedPrint_Tot)
1320*f6dc9357SAndroid Build Coastguard Worker   {
1321*f6dc9357SAndroid Build Coastguard Worker     CTotalBenchRes2 tot_BenchRes = sd.Enc_BenchRes;
1322*f6dc9357SAndroid Build Coastguard Worker     tot_BenchRes.Update_With_Res2(sd.Dec_BenchRes);
1323*f6dc9357SAndroid Build Coastguard Worker     PrintBenchRes(tot_BenchRes, k_Ids_Tot);
1324*f6dc9357SAndroid Build Coastguard Worker   }
1325*f6dc9357SAndroid Build Coastguard Worker 
1326*f6dc9357SAndroid Build Coastguard Worker 
1327*f6dc9357SAndroid Build Coastguard Worker   if (sd.NeedPrint_RatingVector)
1328*f6dc9357SAndroid Build Coastguard Worker   // for (unsigned k = 0; k < 1; k++)
1329*f6dc9357SAndroid Build Coastguard Worker   {
1330*f6dc9357SAndroid Build Coastguard Worker     UString s;
1331*f6dc9357SAndroid Build Coastguard Worker     s += Sync.FreqString_GUI;
1332*f6dc9357SAndroid Build Coastguard Worker     if (!RatingVector.IsEmpty())
1333*f6dc9357SAndroid Build Coastguard Worker     {
1334*f6dc9357SAndroid Build Coastguard Worker       if (!s.IsEmpty())
1335*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
1336*f6dc9357SAndroid Build Coastguard Worker       s += "Compr Decompr Total   CPU"
1337*f6dc9357SAndroid Build Coastguard Worker           #ifdef PRINT_ITER_TIME
1338*f6dc9357SAndroid Build Coastguard Worker           "   Time"
1339*f6dc9357SAndroid Build Coastguard Worker           #endif
1340*f6dc9357SAndroid Build Coastguard Worker           ;
1341*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
1342*f6dc9357SAndroid Build Coastguard Worker     }
1343*f6dc9357SAndroid Build Coastguard Worker     // s += "GIPS    GIPS   GIPS    %   s"; s.Add_LF();
1344*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < RatingVector.Size(); i++)
1345*f6dc9357SAndroid Build Coastguard Worker     {
1346*f6dc9357SAndroid Build Coastguard Worker       if (i != 0)
1347*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
1348*f6dc9357SAndroid Build Coastguard Worker       if ((int)i == sd.RatingVector_DeletedIndex)
1349*f6dc9357SAndroid Build Coastguard Worker       {
1350*f6dc9357SAndroid Build Coastguard Worker         s += "...";
1351*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
1352*f6dc9357SAndroid Build Coastguard Worker       }
1353*f6dc9357SAndroid Build Coastguard Worker       const CBenchPassResult &pair = RatingVector[i];
1354*f6dc9357SAndroid Build Coastguard Worker       /*
1355*f6dc9357SAndroid Build Coastguard Worker         s += "g:"; s.Add_UInt32((UInt32)pair.EncInfo.GlobalTime);
1356*f6dc9357SAndroid Build Coastguard Worker         s += " u:"; s.Add_UInt32((UInt32)pair.EncInfo.UserTime);
1357*f6dc9357SAndroid Build Coastguard Worker         s.Add_Space();
1358*f6dc9357SAndroid Build Coastguard Worker       */
1359*f6dc9357SAndroid Build Coastguard Worker       AddRatingsLine(s, pair.Enc, pair.Dec
1360*f6dc9357SAndroid Build Coastguard Worker             #ifdef PRINT_ITER_TIME
1361*f6dc9357SAndroid Build Coastguard Worker             , pair.Ticks
1362*f6dc9357SAndroid Build Coastguard Worker             #endif
1363*f6dc9357SAndroid Build Coastguard Worker             );
1364*f6dc9357SAndroid Build Coastguard Worker       /*
1365*f6dc9357SAndroid Build Coastguard Worker       {
1366*f6dc9357SAndroid Build Coastguard Worker         UInt64 v = i + 1;
1367*f6dc9357SAndroid Build Coastguard Worker         if (sd.RatingVector_DeletedIndex >= 0 && i >= (unsigned)sd.RatingVector_DeletedIndex)
1368*f6dc9357SAndroid Build Coastguard Worker           v += sd.RatingVector_NumDeleted;
1369*f6dc9357SAndroid Build Coastguard Worker         char temp[64];
1370*f6dc9357SAndroid Build Coastguard Worker         ConvertUInt64ToString(v, temp);
1371*f6dc9357SAndroid Build Coastguard Worker         s += " : ";
1372*f6dc9357SAndroid Build Coastguard Worker         s += temp;
1373*f6dc9357SAndroid Build Coastguard Worker       }
1374*f6dc9357SAndroid Build Coastguard Worker       */
1375*f6dc9357SAndroid Build Coastguard Worker     }
1376*f6dc9357SAndroid Build Coastguard Worker 
1377*f6dc9357SAndroid Build Coastguard Worker     if (sd.BenchWasFinished)
1378*f6dc9357SAndroid Build Coastguard Worker     {
1379*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
1380*f6dc9357SAndroid Build Coastguard Worker       s += "-------------";
1381*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
1382*f6dc9357SAndroid Build Coastguard Worker       {
1383*f6dc9357SAndroid Build Coastguard Worker         // average time is not correct because of freq detection in first iteration
1384*f6dc9357SAndroid Build Coastguard Worker         AddRatingsLine(s, sd.Enc_BenchRes, sd.Dec_BenchRes
1385*f6dc9357SAndroid Build Coastguard Worker               #ifdef PRINT_ITER_TIME
1386*f6dc9357SAndroid Build Coastguard Worker               , (DWORD)(sd.TotalTicks / (sd.NumPasses_Finished ? sd.NumPasses_Finished : 1))
1387*f6dc9357SAndroid Build Coastguard Worker               #endif
1388*f6dc9357SAndroid Build Coastguard Worker               );
1389*f6dc9357SAndroid Build Coastguard Worker       }
1390*f6dc9357SAndroid Build Coastguard Worker     }
1391*f6dc9357SAndroid Build Coastguard Worker     // s.Add_LF(); s += "OnTimer: "; s.Add_UInt32(k_OnTimer_cnt);
1392*f6dc9357SAndroid Build Coastguard Worker     // s.Add_LF(); s += "finished Message: "; s.Add_UInt32(k_Message_Finished_cnt);
1393*f6dc9357SAndroid Build Coastguard Worker     // static cnt = 0; cnt++; s.Add_LF(); s += "Print: "; s.Add_UInt32(cnt);
1394*f6dc9357SAndroid Build Coastguard Worker     // s.Add_LF(); s += "NumEncProgress: "; s.Add_UInt32((UInt32)sd.NumEncProgress);
1395*f6dc9357SAndroid Build Coastguard Worker     // s.Add_LF(); s += "NumDecProgress: "; s.Add_UInt32((UInt32)sd.NumDecProgress);
1396*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_BENCH_LOG, s);
1397*f6dc9357SAndroid Build Coastguard Worker   }
1398*f6dc9357SAndroid Build Coastguard Worker }
1399*f6dc9357SAndroid Build Coastguard Worker 
1400*f6dc9357SAndroid Build Coastguard Worker 
1401*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnCommand(unsigned code, unsigned itemID, LPARAM lParam)
1402*f6dc9357SAndroid Build Coastguard Worker {
1403*f6dc9357SAndroid Build Coastguard Worker   if (code == CBN_SELCHANGE &&
1404*f6dc9357SAndroid Build Coastguard Worker       (itemID == IDC_BENCH_DICTIONARY ||
1405*f6dc9357SAndroid Build Coastguard Worker        itemID == IDC_BENCH_NUM_PASSES ||
1406*f6dc9357SAndroid Build Coastguard Worker        itemID == IDC_BENCH_NUM_THREADS))
1407*f6dc9357SAndroid Build Coastguard Worker   {
1408*f6dc9357SAndroid Build Coastguard Worker     RestartBenchmark();
1409*f6dc9357SAndroid Build Coastguard Worker     return true;
1410*f6dc9357SAndroid Build Coastguard Worker   }
1411*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnCommand(code, itemID, lParam);
1412*f6dc9357SAndroid Build Coastguard Worker }
1413*f6dc9357SAndroid Build Coastguard Worker 
1414*f6dc9357SAndroid Build Coastguard Worker 
1415*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
1416*f6dc9357SAndroid Build Coastguard Worker {
1417*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
1418*f6dc9357SAndroid Build Coastguard Worker   {
1419*f6dc9357SAndroid Build Coastguard Worker     case IDB_RESTART:
1420*f6dc9357SAndroid Build Coastguard Worker       RestartBenchmark();
1421*f6dc9357SAndroid Build Coastguard Worker       return true;
1422*f6dc9357SAndroid Build Coastguard Worker     case IDB_STOP:
1423*f6dc9357SAndroid Build Coastguard Worker       OnStopButton();
1424*f6dc9357SAndroid Build Coastguard Worker       return true;
1425*f6dc9357SAndroid Build Coastguard Worker   }
1426*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
1427*f6dc9357SAndroid Build Coastguard Worker }
1428*f6dc9357SAndroid Build Coastguard Worker 
1429*f6dc9357SAndroid Build Coastguard Worker 
1430*f6dc9357SAndroid Build Coastguard Worker 
1431*f6dc9357SAndroid Build Coastguard Worker 
1432*f6dc9357SAndroid Build Coastguard Worker 
1433*f6dc9357SAndroid Build Coastguard Worker // ---------- Benchmark Thread ----------
1434*f6dc9357SAndroid Build Coastguard Worker 
1435*f6dc9357SAndroid Build Coastguard Worker struct CBenchCallback Z7_final: public IBenchCallback
1436*f6dc9357SAndroid Build Coastguard Worker {
1437*f6dc9357SAndroid Build Coastguard Worker   UInt64 dictionarySize;
1438*f6dc9357SAndroid Build Coastguard Worker   CBenchProgressSync *Sync;
1439*f6dc9357SAndroid Build Coastguard Worker   CBenchmarkDialog *BenchmarkDialog;
1440*f6dc9357SAndroid Build Coastguard Worker 
1441*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetEncodeResult(const CBenchInfo &info, bool final) Z7_override;
1442*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetDecodeResult(const CBenchInfo &info, bool final) Z7_override;
1443*f6dc9357SAndroid Build Coastguard Worker };
1444*f6dc9357SAndroid Build Coastguard Worker 
1445*f6dc9357SAndroid Build Coastguard Worker HRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final)
1446*f6dc9357SAndroid Build Coastguard Worker {
1447*f6dc9357SAndroid Build Coastguard Worker   bool needPost = false;
1448*f6dc9357SAndroid Build Coastguard Worker   {
1449*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(Sync->CS);
1450*f6dc9357SAndroid Build Coastguard Worker     if (Sync->Exit)
1451*f6dc9357SAndroid Build Coastguard Worker       return E_ABORT;
1452*f6dc9357SAndroid Build Coastguard Worker     CSyncData &sd = Sync->sd;
1453*f6dc9357SAndroid Build Coastguard Worker     // sd.NumEncProgress++;
1454*f6dc9357SAndroid Build Coastguard Worker     CTotalBenchRes2 &br = sd.Enc_BenchRes_1;
1455*f6dc9357SAndroid Build Coastguard Worker     {
1456*f6dc9357SAndroid Build Coastguard Worker       UInt64 dictSize = Sync->DictSize;
1457*f6dc9357SAndroid Build Coastguard Worker       if (final)
1458*f6dc9357SAndroid Build Coastguard Worker       {
1459*f6dc9357SAndroid Build Coastguard Worker         // sd.EncInfo = info;
1460*f6dc9357SAndroid Build Coastguard Worker       }
1461*f6dc9357SAndroid Build Coastguard Worker       else
1462*f6dc9357SAndroid Build Coastguard Worker       {
1463*f6dc9357SAndroid Build Coastguard Worker         /* if (!final), then CBenchInfo::NumIterations means totalNumber of threads.
1464*f6dc9357SAndroid Build Coastguard Worker            so we can reduce the dictionary */
1465*f6dc9357SAndroid Build Coastguard Worker         if (dictSize > info.UnpackSize)
1466*f6dc9357SAndroid Build Coastguard Worker           dictSize = info.UnpackSize;
1467*f6dc9357SAndroid Build Coastguard Worker       }
1468*f6dc9357SAndroid Build Coastguard Worker       br.Rating = info.GetRating_LzmaEnc(dictSize);
1469*f6dc9357SAndroid Build Coastguard Worker     }
1470*f6dc9357SAndroid Build Coastguard Worker     br.SetFrom_BenchInfo(info);
1471*f6dc9357SAndroid Build Coastguard Worker     sd.NeedPrint_Enc_1 = true;
1472*f6dc9357SAndroid Build Coastguard Worker     if (final)
1473*f6dc9357SAndroid Build Coastguard Worker     {
1474*f6dc9357SAndroid Build Coastguard Worker       sd.Enc_BenchRes.Update_With_Res2(br);
1475*f6dc9357SAndroid Build Coastguard Worker       sd.NeedPrint_Enc = true;
1476*f6dc9357SAndroid Build Coastguard Worker       needPost = true;
1477*f6dc9357SAndroid Build Coastguard Worker     }
1478*f6dc9357SAndroid Build Coastguard Worker   }
1479*f6dc9357SAndroid Build Coastguard Worker 
1480*f6dc9357SAndroid Build Coastguard Worker   if (needPost)
1481*f6dc9357SAndroid Build Coastguard Worker     BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1482*f6dc9357SAndroid Build Coastguard Worker 
1483*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1484*f6dc9357SAndroid Build Coastguard Worker }
1485*f6dc9357SAndroid Build Coastguard Worker 
1486*f6dc9357SAndroid Build Coastguard Worker 
1487*f6dc9357SAndroid Build Coastguard Worker HRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final)
1488*f6dc9357SAndroid Build Coastguard Worker {
1489*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(Sync->CS);
1490*f6dc9357SAndroid Build Coastguard Worker   if (Sync->Exit)
1491*f6dc9357SAndroid Build Coastguard Worker     return E_ABORT;
1492*f6dc9357SAndroid Build Coastguard Worker   CSyncData &sd = Sync->sd;
1493*f6dc9357SAndroid Build Coastguard Worker   // sd.NumDecProgress++;
1494*f6dc9357SAndroid Build Coastguard Worker   CTotalBenchRes2 &br = sd.Dec_BenchRes_1;
1495*f6dc9357SAndroid Build Coastguard Worker   br.Rating = info.GetRating_LzmaDec();
1496*f6dc9357SAndroid Build Coastguard Worker   br.SetFrom_BenchInfo(info);
1497*f6dc9357SAndroid Build Coastguard Worker   sd.NeedPrint_Dec_1 = true;
1498*f6dc9357SAndroid Build Coastguard Worker   if (final)
1499*f6dc9357SAndroid Build Coastguard Worker     sd.Dec_BenchRes.Update_With_Res2(br);
1500*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1501*f6dc9357SAndroid Build Coastguard Worker }
1502*f6dc9357SAndroid Build Coastguard Worker 
1503*f6dc9357SAndroid Build Coastguard Worker 
1504*f6dc9357SAndroid Build Coastguard Worker struct CBenchCallback2 Z7_final: public IBenchPrintCallback
1505*f6dc9357SAndroid Build Coastguard Worker {
1506*f6dc9357SAndroid Build Coastguard Worker   CBenchProgressSync *Sync;
1507*f6dc9357SAndroid Build Coastguard Worker   bool TotalMode;
1508*f6dc9357SAndroid Build Coastguard Worker 
1509*f6dc9357SAndroid Build Coastguard Worker   void Print(const char *s) Z7_override;
1510*f6dc9357SAndroid Build Coastguard Worker   void NewLine() Z7_override;
1511*f6dc9357SAndroid Build Coastguard Worker   HRESULT CheckBreak() Z7_override;
1512*f6dc9357SAndroid Build Coastguard Worker };
1513*f6dc9357SAndroid Build Coastguard Worker 
1514*f6dc9357SAndroid Build Coastguard Worker void CBenchCallback2::Print(const char *s)
1515*f6dc9357SAndroid Build Coastguard Worker {
1516*f6dc9357SAndroid Build Coastguard Worker   if (TotalMode)
1517*f6dc9357SAndroid Build Coastguard Worker   {
1518*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(Sync->CS);
1519*f6dc9357SAndroid Build Coastguard Worker     Sync->Text += s;
1520*f6dc9357SAndroid Build Coastguard Worker     Sync->TextWasChanged = true;
1521*f6dc9357SAndroid Build Coastguard Worker   }
1522*f6dc9357SAndroid Build Coastguard Worker }
1523*f6dc9357SAndroid Build Coastguard Worker 
1524*f6dc9357SAndroid Build Coastguard Worker void CBenchCallback2::NewLine()
1525*f6dc9357SAndroid Build Coastguard Worker {
1526*f6dc9357SAndroid Build Coastguard Worker   Print("\xD\n");
1527*f6dc9357SAndroid Build Coastguard Worker }
1528*f6dc9357SAndroid Build Coastguard Worker 
1529*f6dc9357SAndroid Build Coastguard Worker HRESULT CBenchCallback2::CheckBreak()
1530*f6dc9357SAndroid Build Coastguard Worker {
1531*f6dc9357SAndroid Build Coastguard Worker   if (Sync->Exit)
1532*f6dc9357SAndroid Build Coastguard Worker     return E_ABORT;
1533*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1534*f6dc9357SAndroid Build Coastguard Worker }
1535*f6dc9357SAndroid Build Coastguard Worker 
1536*f6dc9357SAndroid Build Coastguard Worker 
1537*f6dc9357SAndroid Build Coastguard Worker 
1538*f6dc9357SAndroid Build Coastguard Worker struct CFreqCallback Z7_final: public IBenchFreqCallback
1539*f6dc9357SAndroid Build Coastguard Worker {
1540*f6dc9357SAndroid Build Coastguard Worker   CBenchmarkDialog *BenchmarkDialog;
1541*f6dc9357SAndroid Build Coastguard Worker 
1542*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT AddCpuFreq(unsigned numThreads, UInt64 freq, UInt64 usage) Z7_override;
1543*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT FreqsFinished(unsigned numThreads) Z7_override;
1544*f6dc9357SAndroid Build Coastguard Worker };
1545*f6dc9357SAndroid Build Coastguard Worker 
1546*f6dc9357SAndroid Build Coastguard Worker HRESULT CFreqCallback::AddCpuFreq(unsigned numThreads, UInt64 freq, UInt64 usage)
1547*f6dc9357SAndroid Build Coastguard Worker {
1548*f6dc9357SAndroid Build Coastguard Worker   HRESULT res;
1549*f6dc9357SAndroid Build Coastguard Worker   {
1550*f6dc9357SAndroid Build Coastguard Worker     CBenchProgressSync &sync = BenchmarkDialog->Sync;
1551*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(sync.CS);
1552*f6dc9357SAndroid Build Coastguard Worker     UString &s = sync.FreqString_Sync;
1553*f6dc9357SAndroid Build Coastguard Worker     if (sync.NumFreqThreadsPrev != numThreads)
1554*f6dc9357SAndroid Build Coastguard Worker     {
1555*f6dc9357SAndroid Build Coastguard Worker       sync.NumFreqThreadsPrev = numThreads;
1556*f6dc9357SAndroid Build Coastguard Worker       if (!s.IsEmpty())
1557*f6dc9357SAndroid Build Coastguard Worker         s.Add_LF();
1558*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(numThreads);
1559*f6dc9357SAndroid Build Coastguard Worker       s += "T Frequency (MHz):";
1560*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
1561*f6dc9357SAndroid Build Coastguard Worker     }
1562*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
1563*f6dc9357SAndroid Build Coastguard Worker     if (numThreads != 1)
1564*f6dc9357SAndroid Build Coastguard Worker     {
1565*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt64(GetUsagePercents(usage));
1566*f6dc9357SAndroid Build Coastguard Worker       s.Add_Char('%');
1567*f6dc9357SAndroid Build Coastguard Worker       s.Add_Space();
1568*f6dc9357SAndroid Build Coastguard Worker     }
1569*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt64(GetMips(freq));
1570*f6dc9357SAndroid Build Coastguard Worker     // BenchmarkDialog->Sync.sd.NeedPrint_Freq = true;
1571*f6dc9357SAndroid Build Coastguard Worker     res = sync.Exit ? E_ABORT : S_OK;
1572*f6dc9357SAndroid Build Coastguard Worker   }
1573*f6dc9357SAndroid Build Coastguard Worker   // BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1574*f6dc9357SAndroid Build Coastguard Worker   return res;
1575*f6dc9357SAndroid Build Coastguard Worker }
1576*f6dc9357SAndroid Build Coastguard Worker 
1577*f6dc9357SAndroid Build Coastguard Worker HRESULT CFreqCallback::FreqsFinished(unsigned /* numThreads */)
1578*f6dc9357SAndroid Build Coastguard Worker {
1579*f6dc9357SAndroid Build Coastguard Worker   HRESULT res;
1580*f6dc9357SAndroid Build Coastguard Worker   {
1581*f6dc9357SAndroid Build Coastguard Worker     CBenchProgressSync &sync = BenchmarkDialog->Sync;
1582*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(sync.CS);
1583*f6dc9357SAndroid Build Coastguard Worker     sync.sd.NeedPrint_Freq = true;
1584*f6dc9357SAndroid Build Coastguard Worker     BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1585*f6dc9357SAndroid Build Coastguard Worker     res = sync.Exit ? E_ABORT : S_OK;
1586*f6dc9357SAndroid Build Coastguard Worker   }
1587*f6dc9357SAndroid Build Coastguard Worker   BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1588*f6dc9357SAndroid Build Coastguard Worker   return res;
1589*f6dc9357SAndroid Build Coastguard Worker }
1590*f6dc9357SAndroid Build Coastguard Worker 
1591*f6dc9357SAndroid Build Coastguard Worker 
1592*f6dc9357SAndroid Build Coastguard Worker 
1593*f6dc9357SAndroid Build Coastguard Worker // define USE_DUMMY only for debug
1594*f6dc9357SAndroid Build Coastguard Worker // #define USE_DUMMY
1595*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_DUMMY
1596*f6dc9357SAndroid Build Coastguard Worker static unsigned dummy = 1;
1597*f6dc9357SAndroid Build Coastguard Worker static unsigned Dummy(unsigned limit)
1598*f6dc9357SAndroid Build Coastguard Worker {
1599*f6dc9357SAndroid Build Coastguard Worker   unsigned sum = 0;
1600*f6dc9357SAndroid Build Coastguard Worker   for (unsigned k = 0; k < limit; k++)
1601*f6dc9357SAndroid Build Coastguard Worker   {
1602*f6dc9357SAndroid Build Coastguard Worker     sum += dummy;
1603*f6dc9357SAndroid Build Coastguard Worker     if (sum == 0)
1604*f6dc9357SAndroid Build Coastguard Worker       break;
1605*f6dc9357SAndroid Build Coastguard Worker   }
1606*f6dc9357SAndroid Build Coastguard Worker   return sum;
1607*f6dc9357SAndroid Build Coastguard Worker }
1608*f6dc9357SAndroid Build Coastguard Worker #endif
1609*f6dc9357SAndroid Build Coastguard Worker 
1610*f6dc9357SAndroid Build Coastguard Worker 
1611*f6dc9357SAndroid Build Coastguard Worker HRESULT CThreadBenchmark::Process()
1612*f6dc9357SAndroid Build Coastguard Worker {
1613*f6dc9357SAndroid Build Coastguard Worker   /* the first benchmark pass can be slow,
1614*f6dc9357SAndroid Build Coastguard Worker      if we run benchmark while the window is being created,
1615*f6dc9357SAndroid Build Coastguard Worker      and (no freq detecion loop) && (dictionary is small) (-mtic is small) */
1616*f6dc9357SAndroid Build Coastguard Worker 
1617*f6dc9357SAndroid Build Coastguard Worker   // Sleep(300); // for debug
1618*f6dc9357SAndroid Build Coastguard Worker   #ifdef USE_DUMMY
1619*f6dc9357SAndroid Build Coastguard Worker   Dummy(1000 * 1000 * 1000); // for debug
1620*f6dc9357SAndroid Build Coastguard Worker   #endif
1621*f6dc9357SAndroid Build Coastguard Worker 
1622*f6dc9357SAndroid Build Coastguard Worker   CBenchProgressSync &sync = BenchmarkDialog->Sync;
1623*f6dc9357SAndroid Build Coastguard Worker   HRESULT finishHRESULT = S_OK;
1624*f6dc9357SAndroid Build Coastguard Worker 
1625*f6dc9357SAndroid Build Coastguard Worker   try
1626*f6dc9357SAndroid Build Coastguard Worker   {
1627*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 passIndex = 0;; passIndex++)
1628*f6dc9357SAndroid Build Coastguard Worker     {
1629*f6dc9357SAndroid Build Coastguard Worker       // throw 1; // to debug
1630*f6dc9357SAndroid Build Coastguard Worker       // throw CSystemException(E_INVALIDARG); // to debug
1631*f6dc9357SAndroid Build Coastguard Worker 
1632*f6dc9357SAndroid Build Coastguard Worker       UInt64 dictionarySize;
1633*f6dc9357SAndroid Build Coastguard Worker       UInt32 numThreads;
1634*f6dc9357SAndroid Build Coastguard Worker       {
1635*f6dc9357SAndroid Build Coastguard Worker         NSynchronization::CCriticalSectionLock lock(sync.CS);
1636*f6dc9357SAndroid Build Coastguard Worker         if (sync.Exit)
1637*f6dc9357SAndroid Build Coastguard Worker           break;
1638*f6dc9357SAndroid Build Coastguard Worker         dictionarySize = sync.DictSize;
1639*f6dc9357SAndroid Build Coastguard Worker         numThreads = sync.NumThreads;
1640*f6dc9357SAndroid Build Coastguard Worker       }
1641*f6dc9357SAndroid Build Coastguard Worker 
1642*f6dc9357SAndroid Build Coastguard Worker       #ifdef PRINT_ITER_TIME
1643*f6dc9357SAndroid Build Coastguard Worker       const DWORD startTick = GetTickCount();
1644*f6dc9357SAndroid Build Coastguard Worker       #endif
1645*f6dc9357SAndroid Build Coastguard Worker 
1646*f6dc9357SAndroid Build Coastguard Worker       CBenchCallback callback;
1647*f6dc9357SAndroid Build Coastguard Worker 
1648*f6dc9357SAndroid Build Coastguard Worker       callback.dictionarySize = dictionarySize;
1649*f6dc9357SAndroid Build Coastguard Worker       callback.Sync = &sync;
1650*f6dc9357SAndroid Build Coastguard Worker       callback.BenchmarkDialog = BenchmarkDialog;
1651*f6dc9357SAndroid Build Coastguard Worker 
1652*f6dc9357SAndroid Build Coastguard Worker       CBenchCallback2 callback2;
1653*f6dc9357SAndroid Build Coastguard Worker       callback2.TotalMode = BenchmarkDialog->TotalMode;
1654*f6dc9357SAndroid Build Coastguard Worker       callback2.Sync = &sync;
1655*f6dc9357SAndroid Build Coastguard Worker 
1656*f6dc9357SAndroid Build Coastguard Worker       CFreqCallback freqCallback;
1657*f6dc9357SAndroid Build Coastguard Worker       freqCallback.BenchmarkDialog = BenchmarkDialog;
1658*f6dc9357SAndroid Build Coastguard Worker 
1659*f6dc9357SAndroid Build Coastguard Worker       HRESULT result;
1660*f6dc9357SAndroid Build Coastguard Worker 
1661*f6dc9357SAndroid Build Coastguard Worker       try
1662*f6dc9357SAndroid Build Coastguard Worker       {
1663*f6dc9357SAndroid Build Coastguard Worker         CObjectVector<CProperty> props;
1664*f6dc9357SAndroid Build Coastguard Worker 
1665*f6dc9357SAndroid Build Coastguard Worker         props = BenchmarkDialog->Props;
1666*f6dc9357SAndroid Build Coastguard Worker 
1667*f6dc9357SAndroid Build Coastguard Worker         if (BenchmarkDialog->TotalMode)
1668*f6dc9357SAndroid Build Coastguard Worker         {
1669*f6dc9357SAndroid Build Coastguard Worker           props = BenchmarkDialog->Props;
1670*f6dc9357SAndroid Build Coastguard Worker         }
1671*f6dc9357SAndroid Build Coastguard Worker         else
1672*f6dc9357SAndroid Build Coastguard Worker         {
1673*f6dc9357SAndroid Build Coastguard Worker           {
1674*f6dc9357SAndroid Build Coastguard Worker             CProperty prop;
1675*f6dc9357SAndroid Build Coastguard Worker             prop.Name = "mt";
1676*f6dc9357SAndroid Build Coastguard Worker             prop.Value.Add_UInt32(numThreads);
1677*f6dc9357SAndroid Build Coastguard Worker             props.Add(prop);
1678*f6dc9357SAndroid Build Coastguard Worker           }
1679*f6dc9357SAndroid Build Coastguard Worker           {
1680*f6dc9357SAndroid Build Coastguard Worker             CProperty prop;
1681*f6dc9357SAndroid Build Coastguard Worker             prop.Name = 'd';
1682*f6dc9357SAndroid Build Coastguard Worker             prop.Name.Add_UInt32((UInt32)(dictionarySize >> 10));
1683*f6dc9357SAndroid Build Coastguard Worker             prop.Name.Add_Char('k');
1684*f6dc9357SAndroid Build Coastguard Worker             props.Add(prop);
1685*f6dc9357SAndroid Build Coastguard Worker           }
1686*f6dc9357SAndroid Build Coastguard Worker         }
1687*f6dc9357SAndroid Build Coastguard Worker 
1688*f6dc9357SAndroid Build Coastguard Worker         result = Bench(EXTERNAL_CODECS_LOC_VARS
1689*f6dc9357SAndroid Build Coastguard Worker             BenchmarkDialog->TotalMode ? &callback2 : NULL,
1690*f6dc9357SAndroid Build Coastguard Worker             BenchmarkDialog->TotalMode ? NULL : &callback,
1691*f6dc9357SAndroid Build Coastguard Worker             props, 1, false,
1692*f6dc9357SAndroid Build Coastguard Worker             (!BenchmarkDialog->TotalMode) && passIndex == 0 ? &freqCallback: NULL);
1693*f6dc9357SAndroid Build Coastguard Worker 
1694*f6dc9357SAndroid Build Coastguard Worker         // result = S_FALSE; // for debug;
1695*f6dc9357SAndroid Build Coastguard Worker         // throw 1;
1696*f6dc9357SAndroid Build Coastguard Worker       }
1697*f6dc9357SAndroid Build Coastguard Worker       catch(...)
1698*f6dc9357SAndroid Build Coastguard Worker       {
1699*f6dc9357SAndroid Build Coastguard Worker         result = E_FAIL;
1700*f6dc9357SAndroid Build Coastguard Worker       }
1701*f6dc9357SAndroid Build Coastguard Worker 
1702*f6dc9357SAndroid Build Coastguard Worker       #ifdef PRINT_ITER_TIME
1703*f6dc9357SAndroid Build Coastguard Worker       const DWORD numTicks = GetTickCount() - startTick;
1704*f6dc9357SAndroid Build Coastguard Worker       #endif
1705*f6dc9357SAndroid Build Coastguard Worker 
1706*f6dc9357SAndroid Build Coastguard Worker       bool finished = true;
1707*f6dc9357SAndroid Build Coastguard Worker 
1708*f6dc9357SAndroid Build Coastguard Worker       NSynchronization::CCriticalSectionLock lock(sync.CS);
1709*f6dc9357SAndroid Build Coastguard Worker 
1710*f6dc9357SAndroid Build Coastguard Worker       if (result != S_OK)
1711*f6dc9357SAndroid Build Coastguard Worker       {
1712*f6dc9357SAndroid Build Coastguard Worker         sync.BenchFinish_Task_HRESULT = result;
1713*f6dc9357SAndroid Build Coastguard Worker         break;
1714*f6dc9357SAndroid Build Coastguard Worker       }
1715*f6dc9357SAndroid Build Coastguard Worker 
1716*f6dc9357SAndroid Build Coastguard Worker       {
1717*f6dc9357SAndroid Build Coastguard Worker         CSyncData &sd = sync.sd;
1718*f6dc9357SAndroid Build Coastguard Worker 
1719*f6dc9357SAndroid Build Coastguard Worker         sd.NumPasses_Finished++;
1720*f6dc9357SAndroid Build Coastguard Worker         #ifdef PRINT_ITER_TIME
1721*f6dc9357SAndroid Build Coastguard Worker         sd.TotalTicks += numTicks;
1722*f6dc9357SAndroid Build Coastguard Worker         #endif
1723*f6dc9357SAndroid Build Coastguard Worker 
1724*f6dc9357SAndroid Build Coastguard Worker         if (BenchmarkDialog->TotalMode)
1725*f6dc9357SAndroid Build Coastguard Worker           break;
1726*f6dc9357SAndroid Build Coastguard Worker 
1727*f6dc9357SAndroid Build Coastguard Worker         {
1728*f6dc9357SAndroid Build Coastguard Worker           CTotalBenchRes tot_BenchRes = sd.Enc_BenchRes_1;
1729*f6dc9357SAndroid Build Coastguard Worker           tot_BenchRes.Update_With_Res(sd.Dec_BenchRes_1);
1730*f6dc9357SAndroid Build Coastguard Worker 
1731*f6dc9357SAndroid Build Coastguard Worker           sd.NeedPrint_RatingVector = true;
1732*f6dc9357SAndroid Build Coastguard Worker           {
1733*f6dc9357SAndroid Build Coastguard Worker             CBenchPassResult pair;
1734*f6dc9357SAndroid Build Coastguard Worker             // pair.EncInfo = sd.EncInfo; // for debug
1735*f6dc9357SAndroid Build Coastguard Worker             pair.Enc = sd.Enc_BenchRes_1;
1736*f6dc9357SAndroid Build Coastguard Worker             pair.Dec = sd.Dec_BenchRes_1;
1737*f6dc9357SAndroid Build Coastguard Worker             #ifdef PRINT_ITER_TIME
1738*f6dc9357SAndroid Build Coastguard Worker             pair.Ticks = numTicks;
1739*f6dc9357SAndroid Build Coastguard Worker             #endif
1740*f6dc9357SAndroid Build Coastguard Worker             sync.RatingVector.Add(pair);
1741*f6dc9357SAndroid Build Coastguard Worker             // pair.Dec_Defined = true;
1742*f6dc9357SAndroid Build Coastguard Worker           }
1743*f6dc9357SAndroid Build Coastguard Worker         }
1744*f6dc9357SAndroid Build Coastguard Worker 
1745*f6dc9357SAndroid Build Coastguard Worker         sd.NeedPrint_Dec = true;
1746*f6dc9357SAndroid Build Coastguard Worker         sd.NeedPrint_Tot = true;
1747*f6dc9357SAndroid Build Coastguard Worker 
1748*f6dc9357SAndroid Build Coastguard Worker         if (sync.RatingVector.Size() > kRatingVector_NumBundlesMax)
1749*f6dc9357SAndroid Build Coastguard Worker         {
1750*f6dc9357SAndroid Build Coastguard Worker           // sd.RatingVector_NumDeleted++;
1751*f6dc9357SAndroid Build Coastguard Worker           sd.RatingVector_DeletedIndex = (int)(kRatingVector_NumBundlesMax / 4);
1752*f6dc9357SAndroid Build Coastguard Worker           sync.RatingVector.Delete((unsigned)(sd.RatingVector_DeletedIndex));
1753*f6dc9357SAndroid Build Coastguard Worker         }
1754*f6dc9357SAndroid Build Coastguard Worker 
1755*f6dc9357SAndroid Build Coastguard Worker         if (sync.sd.NumPasses_Finished < sync.NumPasses_Limit)
1756*f6dc9357SAndroid Build Coastguard Worker           finished = false;
1757*f6dc9357SAndroid Build Coastguard Worker         else
1758*f6dc9357SAndroid Build Coastguard Worker         {
1759*f6dc9357SAndroid Build Coastguard Worker           sync.sd.BenchWasFinished = true;
1760*f6dc9357SAndroid Build Coastguard Worker           // BenchmarkDialog->_finishTime = GetTickCount();
1761*f6dc9357SAndroid Build Coastguard Worker           // return 0;
1762*f6dc9357SAndroid Build Coastguard Worker         }
1763*f6dc9357SAndroid Build Coastguard Worker       }
1764*f6dc9357SAndroid Build Coastguard Worker 
1765*f6dc9357SAndroid Build Coastguard Worker       if (BenchmarkDialog->TotalMode)
1766*f6dc9357SAndroid Build Coastguard Worker         break;
1767*f6dc9357SAndroid Build Coastguard Worker 
1768*f6dc9357SAndroid Build Coastguard Worker       /*
1769*f6dc9357SAndroid Build Coastguard Worker       if (newTick - prevTick < 1000)
1770*f6dc9357SAndroid Build Coastguard Worker         numSameTick++;
1771*f6dc9357SAndroid Build Coastguard Worker       if (numSameTick > 5 || finished)
1772*f6dc9357SAndroid Build Coastguard Worker       {
1773*f6dc9357SAndroid Build Coastguard Worker         prevTick = newTick;
1774*f6dc9357SAndroid Build Coastguard Worker         numSameTick = 0;
1775*f6dc9357SAndroid Build Coastguard Worker       */
1776*f6dc9357SAndroid Build Coastguard Worker       // for (unsigned i = 0; i < 1; i++)
1777*f6dc9357SAndroid Build Coastguard Worker       {
1778*f6dc9357SAndroid Build Coastguard Worker         // we suppose that PostMsg messages will be processed in order.
1779*f6dc9357SAndroid Build Coastguard Worker         if (!BenchmarkDialog->PostMsg_Finish(k_Msg_WPARM_Iter_Finished))
1780*f6dc9357SAndroid Build Coastguard Worker         {
1781*f6dc9357SAndroid Build Coastguard Worker           finished = true;
1782*f6dc9357SAndroid Build Coastguard Worker           finishHRESULT = E_FAIL;
1783*f6dc9357SAndroid Build Coastguard Worker           // throw 1234567;
1784*f6dc9357SAndroid Build Coastguard Worker         }
1785*f6dc9357SAndroid Build Coastguard Worker       }
1786*f6dc9357SAndroid Build Coastguard Worker       if (finished)
1787*f6dc9357SAndroid Build Coastguard Worker         break;
1788*f6dc9357SAndroid Build Coastguard Worker     }
1789*f6dc9357SAndroid Build Coastguard Worker     // return S_OK;
1790*f6dc9357SAndroid Build Coastguard Worker   }
1791*f6dc9357SAndroid Build Coastguard Worker   catch(CSystemException &e)
1792*f6dc9357SAndroid Build Coastguard Worker   {
1793*f6dc9357SAndroid Build Coastguard Worker     finishHRESULT = e.ErrorCode;
1794*f6dc9357SAndroid Build Coastguard Worker     // BenchmarkDialog->MessageBoxError(HResultToMessage(e.ErrorCode));
1795*f6dc9357SAndroid Build Coastguard Worker     // return E_FAIL;
1796*f6dc9357SAndroid Build Coastguard Worker   }
1797*f6dc9357SAndroid Build Coastguard Worker   catch(...)
1798*f6dc9357SAndroid Build Coastguard Worker   {
1799*f6dc9357SAndroid Build Coastguard Worker     finishHRESULT = E_FAIL;
1800*f6dc9357SAndroid Build Coastguard Worker     // BenchmarkDialog->MessageBoxError(HResultToMessage(E_FAIL));
1801*f6dc9357SAndroid Build Coastguard Worker     // return E_FAIL;
1802*f6dc9357SAndroid Build Coastguard Worker   }
1803*f6dc9357SAndroid Build Coastguard Worker 
1804*f6dc9357SAndroid Build Coastguard Worker   if (finishHRESULT != S_OK)
1805*f6dc9357SAndroid Build Coastguard Worker   {
1806*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(sync.CS);
1807*f6dc9357SAndroid Build Coastguard Worker     sync.BenchFinish_Thread_HRESULT = finishHRESULT;
1808*f6dc9357SAndroid Build Coastguard Worker   }
1809*f6dc9357SAndroid Build Coastguard Worker   if (!BenchmarkDialog->PostMsg_Finish(k_Msg_WPARM_Thread_Finished))
1810*f6dc9357SAndroid Build Coastguard Worker   {
1811*f6dc9357SAndroid Build Coastguard Worker     // sync.BenchFinish_Thread_HRESULT = E_FAIL;
1812*f6dc9357SAndroid Build Coastguard Worker   }
1813*f6dc9357SAndroid Build Coastguard Worker   return 0;
1814*f6dc9357SAndroid Build Coastguard Worker }
1815*f6dc9357SAndroid Build Coastguard Worker 
1816*f6dc9357SAndroid Build Coastguard Worker 
1817*f6dc9357SAndroid Build Coastguard Worker 
1818*f6dc9357SAndroid Build Coastguard Worker static void ParseNumberString(const UString &s, NCOM::CPropVariant &prop)
1819*f6dc9357SAndroid Build Coastguard Worker {
1820*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *end;
1821*f6dc9357SAndroid Build Coastguard Worker   UInt64 result = ConvertStringToUInt64(s, &end);
1822*f6dc9357SAndroid Build Coastguard Worker   if (*end != 0 || s.IsEmpty())
1823*f6dc9357SAndroid Build Coastguard Worker     prop = s;
1824*f6dc9357SAndroid Build Coastguard Worker   else if (result <= (UInt32)0xFFFFFFFF)
1825*f6dc9357SAndroid Build Coastguard Worker     prop = (UInt32)result;
1826*f6dc9357SAndroid Build Coastguard Worker   else
1827*f6dc9357SAndroid Build Coastguard Worker     prop = result;
1828*f6dc9357SAndroid Build Coastguard Worker }
1829*f6dc9357SAndroid Build Coastguard Worker 
1830*f6dc9357SAndroid Build Coastguard Worker 
1831*f6dc9357SAndroid Build Coastguard Worker HRESULT Benchmark(
1832*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
1833*f6dc9357SAndroid Build Coastguard Worker     const CObjectVector<CProperty> &props, UInt32 numIterations, HWND hwndParent)
1834*f6dc9357SAndroid Build Coastguard Worker {
1835*f6dc9357SAndroid Build Coastguard Worker   CBenchmarkDialog bd;
1836*f6dc9357SAndroid Build Coastguard Worker 
1837*f6dc9357SAndroid Build Coastguard Worker   bd.TotalMode = false;
1838*f6dc9357SAndroid Build Coastguard Worker   bd.Props = props;
1839*f6dc9357SAndroid Build Coastguard Worker   if (numIterations == 0)
1840*f6dc9357SAndroid Build Coastguard Worker     numIterations = 1;
1841*f6dc9357SAndroid Build Coastguard Worker   bd.Sync.NumPasses_Limit = numIterations;
1842*f6dc9357SAndroid Build Coastguard Worker   bd.Sync.DictSize = (UInt64)(Int64)-1;
1843*f6dc9357SAndroid Build Coastguard Worker   bd.Sync.NumThreads = (UInt32)(Int32)-1;
1844*f6dc9357SAndroid Build Coastguard Worker   bd.Sync.Level = -1;
1845*f6dc9357SAndroid Build Coastguard Worker 
1846*f6dc9357SAndroid Build Coastguard Worker   COneMethodInfo method;
1847*f6dc9357SAndroid Build Coastguard Worker 
1848*f6dc9357SAndroid Build Coastguard Worker   UInt32 numCPUs = 1;
1849*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_ST
1850*f6dc9357SAndroid Build Coastguard Worker   numCPUs = NSystem::GetNumberOfProcessors();
1851*f6dc9357SAndroid Build Coastguard Worker   #endif
1852*f6dc9357SAndroid Build Coastguard Worker   UInt32 numThreads = numCPUs;
1853*f6dc9357SAndroid Build Coastguard Worker 
1854*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, props)
1855*f6dc9357SAndroid Build Coastguard Worker   {
1856*f6dc9357SAndroid Build Coastguard Worker     const CProperty &prop = props[i];
1857*f6dc9357SAndroid Build Coastguard Worker     UString name = prop.Name;
1858*f6dc9357SAndroid Build Coastguard Worker     name.MakeLower_Ascii();
1859*f6dc9357SAndroid Build Coastguard Worker     if (name.IsEqualTo_Ascii_NoCase("m") && prop.Value == L"*")
1860*f6dc9357SAndroid Build Coastguard Worker     {
1861*f6dc9357SAndroid Build Coastguard Worker       bd.TotalMode = true;
1862*f6dc9357SAndroid Build Coastguard Worker       continue;
1863*f6dc9357SAndroid Build Coastguard Worker     }
1864*f6dc9357SAndroid Build Coastguard Worker 
1865*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant propVariant;
1866*f6dc9357SAndroid Build Coastguard Worker     if (!prop.Value.IsEmpty())
1867*f6dc9357SAndroid Build Coastguard Worker       ParseNumberString(prop.Value, propVariant);
1868*f6dc9357SAndroid Build Coastguard Worker     if (name.IsPrefixedBy(L"mt"))
1869*f6dc9357SAndroid Build Coastguard Worker     {
1870*f6dc9357SAndroid Build Coastguard Worker       #ifndef Z7_ST
1871*f6dc9357SAndroid Build Coastguard Worker       RINOK(ParseMtProp(name.Ptr(2), propVariant, numCPUs, numThreads))
1872*f6dc9357SAndroid Build Coastguard Worker       if (numThreads != numCPUs)
1873*f6dc9357SAndroid Build Coastguard Worker         bd.Sync.NumThreads = numThreads;
1874*f6dc9357SAndroid Build Coastguard Worker       #endif
1875*f6dc9357SAndroid Build Coastguard Worker       continue;
1876*f6dc9357SAndroid Build Coastguard Worker     }
1877*f6dc9357SAndroid Build Coastguard Worker     /*
1878*f6dc9357SAndroid Build Coastguard Worker     if (name.IsEqualTo("time"))
1879*f6dc9357SAndroid Build Coastguard Worker     {
1880*f6dc9357SAndroid Build Coastguard Worker       // UInt32 testTime = 4;
1881*f6dc9357SAndroid Build Coastguard Worker       // RINOK(ParsePropToUInt32(L"", propVariant, testTime));
1882*f6dc9357SAndroid Build Coastguard Worker       continue;
1883*f6dc9357SAndroid Build Coastguard Worker     }
1884*f6dc9357SAndroid Build Coastguard Worker     RINOK(method.ParseMethodFromPROPVARIANT(name, propVariant));
1885*f6dc9357SAndroid Build Coastguard Worker     */
1886*f6dc9357SAndroid Build Coastguard Worker     // here we need to parse DictSize property, and ignore unknown properties
1887*f6dc9357SAndroid Build Coastguard Worker     method.ParseMethodFromPROPVARIANT(name, propVariant);
1888*f6dc9357SAndroid Build Coastguard Worker   }
1889*f6dc9357SAndroid Build Coastguard Worker 
1890*f6dc9357SAndroid Build Coastguard Worker   if (bd.TotalMode)
1891*f6dc9357SAndroid Build Coastguard Worker   {
1892*f6dc9357SAndroid Build Coastguard Worker     // bd.Bench2Text.Empty();
1893*f6dc9357SAndroid Build Coastguard Worker     bd.Bench2Text = "7-Zip " MY_VERSION_CPU;
1894*f6dc9357SAndroid Build Coastguard Worker     // bd.Bench2Text.Add_Char((char)0xD);
1895*f6dc9357SAndroid Build Coastguard Worker     bd.Bench2Text.Add_LF();
1896*f6dc9357SAndroid Build Coastguard Worker   }
1897*f6dc9357SAndroid Build Coastguard Worker 
1898*f6dc9357SAndroid Build Coastguard Worker   {
1899*f6dc9357SAndroid Build Coastguard Worker     UInt64 dict;
1900*f6dc9357SAndroid Build Coastguard Worker     if (method.Get_DicSize(dict))
1901*f6dc9357SAndroid Build Coastguard Worker       bd.Sync.DictSize = dict;
1902*f6dc9357SAndroid Build Coastguard Worker   }
1903*f6dc9357SAndroid Build Coastguard Worker   bd.Sync.Level = (int)method.GetLevel();
1904*f6dc9357SAndroid Build Coastguard Worker 
1905*f6dc9357SAndroid Build Coastguard Worker   // Dummy(1000 * 1000 * 1);
1906*f6dc9357SAndroid Build Coastguard Worker 
1907*f6dc9357SAndroid Build Coastguard Worker   {
1908*f6dc9357SAndroid Build Coastguard Worker     CThreadBenchmark &benchmarker = bd._threadBenchmark;
1909*f6dc9357SAndroid Build Coastguard Worker     #ifdef Z7_EXTERNAL_CODECS
1910*f6dc9357SAndroid Build Coastguard Worker     benchmarker._externalCodecs = _externalCodecs;
1911*f6dc9357SAndroid Build Coastguard Worker     #endif
1912*f6dc9357SAndroid Build Coastguard Worker     benchmarker.BenchmarkDialog = &bd;
1913*f6dc9357SAndroid Build Coastguard Worker   }
1914*f6dc9357SAndroid Build Coastguard Worker 
1915*f6dc9357SAndroid Build Coastguard Worker   bd.Create(hwndParent);
1916*f6dc9357SAndroid Build Coastguard Worker 
1917*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1918*f6dc9357SAndroid Build Coastguard Worker }
1919*f6dc9357SAndroid Build Coastguard Worker 
1920*f6dc9357SAndroid Build Coastguard Worker 
1921*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog::~CBenchmarkDialog()
1922*f6dc9357SAndroid Build Coastguard Worker {
1923*f6dc9357SAndroid Build Coastguard Worker   if (_thread.IsCreated())
1924*f6dc9357SAndroid Build Coastguard Worker   {
1925*f6dc9357SAndroid Build Coastguard Worker     /* the following code will be not executed in normal code flow.
1926*f6dc9357SAndroid Build Coastguard Worker        it can be called, if there is some internal failure in dialog code. */
1927*f6dc9357SAndroid Build Coastguard Worker     Attach(NULL);
1928*f6dc9357SAndroid Build Coastguard Worker     MessageBoxError(L"The flaw in benchmark thread code");
1929*f6dc9357SAndroid Build Coastguard Worker     Sync.SendExit();
1930*f6dc9357SAndroid Build Coastguard Worker     _thread.Wait_Close();
1931*f6dc9357SAndroid Build Coastguard Worker   }
1932*f6dc9357SAndroid Build Coastguard Worker }
1933