1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 
29 
30 #define AVER( pFirst, pSecond, Membername ) (( pFirst->Membername + pSecond->Membername ) / 2 )
31 #define DIFF( pFirst, pSecond, Membername ) ( pSecond->Membername - pFirst->Membername )
32 #define S_SAFEDIV( a,b ) ((b)==0?CUniString("#DIV"):UniString::CreateFromInt32( (ULONG) ((a)/(b))))
33 #define S_SAFEDIV_DEC( a,b ) ((b)==0?CUniString("#DIV"):Dec((ULONG) ((a)/(b))))
34 
35 #include <tools/time.hxx>
36 #include <tools/string.hxx>
37 #include <vcl/timer.hxx>
38 
39 #define PROFILE_START	0x01
40 #define PROFILE_END 	0x02
41 
42 
43 struct SysdepProfileSnapshot;
44 struct SysdepStaticData;	// Nicht wirklich statisch, sondern statisch �ber mehrere Snapshots
45 
46 struct ProfileSnapshot
47 {
48 	Time aTime;
49 	SysdepProfileSnapshot *pSysdepProfileSnapshot;
50 	sal_uLong nProcessTicks;
51 	sal_uLong nSystemTicks;
52 };
53 
54 
55 class TTProfiler : private Timer
56 {
57 public:
58 	TTProfiler();
59 	~TTProfiler();
60 
61 	String GetProfileHeader();	// Titelzeile f�r Logdatei
62 	void StartProfileInterval( sal_Bool bReadAnyway = sal_False );	// Zustand merken
63 	void EndProfileInterval();	// Informationszeile zusammenbauen
64 	String GetProfileLine( String &aPrefix );
65 
66 
67 	void StartProfilingPerCommand();	// Jeden Befehl mitschneiden
68 	void StopProfilingPerCommand();
69 	sal_Bool IsProfilingPerCommand() { return bIsProfilingPerCommand; }
70 
71 	void StartPartitioning();
72 	void StopPartitioning();
73 	sal_Bool IsPartitioning() { return bIsPartitioning; }
74 	sal_uLong GetPartitioningTime();
75 
76 	void StartAutoProfiling( sal_uLong nMSec );	// Automatisch alle nMSec Milisekunden sampeln
77 	String GetAutoProfiling();	// Aktuelle `Sammlung` abholen
78 	void StopAutoProfiling();	// Sampeln beenden
79 	sal_Bool IsAutoProfiling() { return bIsAutoProfiling; }
80 
81 private:
82 
83 	void GetProfileSnapshot( ProfileSnapshot *pProfileSnapshot );
84 
85 	// Informationszeile zusammenbauen
86 	String GetProfileLine( ProfileSnapshot *pStart, ProfileSnapshot *pStop );
87 
88 
89 	ProfileSnapshot *mpStart;
90 	ProfileSnapshot *mpEnd;
91 	sal_Bool bIsProfileIntervalStarted;
92 
93 
94 
95 //
96 	sal_Bool bIsProfilingPerCommand;
97 	sal_Bool bIsPartitioning;
98 
99 
100 //	F�r das Automatische Profiling in festen Intervallen
101 
102 	ProfileSnapshot *pAutoStart;
103 	ProfileSnapshot *pAutoEnd;
104 	sal_Bool bIsAutoProfiling;
105 	String aAutoProfileBuffer;
106 
107 	virtual void Timeout();
108 
109 
110 // Einige Hilfsfunktionen
111 
112 //	String Hex( sal_uLong nNr );
113 	String Dec( sal_uLong nNr );	// Ergebnis = nNr / 100 mit 2 Dezimalen
114 	String Pad( const String aS, xub_StrLen nLen );		// F�gt blanks links an den String an
115 
116 /*	Ab hier werden die Methoden Systemabh�ngig in den entsprechenden cxx implementiert
117 	Sie werden von den oberen Methoden gerufen.
118 */
119 
120 	SysdepStaticData *pSysDepStatic;
121 
122 	void InitSysdepProfiler();
123 	void DeinitSysdepProfiler();
124 
125 	SysdepProfileSnapshot *NewSysdepSnapshotData();
126 	void DeleteSysdepSnapshotData( SysdepProfileSnapshot *pSysdepProfileSnapshot );
127 
128 	// Titelzeile f�r Logdatei
129 	String GetSysdepProfileHeader();
130 
131 	// Zustand merken
132 	void GetSysdepProfileSnapshot( SysdepProfileSnapshot *pSysdepProfileSnapshot, sal_uInt16 nMode = PROFILE_START | PROFILE_END );
133 
134 	// Informationszeile zusammenbauen
135 	String GetSysdepProfileLine( SysdepProfileSnapshot *pStart, SysdepProfileSnapshot *pStop );
136 };
137 
138