xref: /trunk/main/automation/source/server/profiler.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_automation.hxx"
30 
31 
32 #include <tools/time.hxx>
33 #include <tools/string.hxx>
34 #include <unotools/localedatawrapper.hxx>
35 #include <vcl/svapp.hxx>
36 #ifndef _BASIC_TTRESHLP_HXX
37 #include <basic/ttstrhlp.hxx>
38 #endif
39 
40 
41 #include "profiler.hxx"
42 
43 
44 TTProfiler::TTProfiler()
45 : mpStart( NULL )
46 , mpEnd( NULL )
47 , bIsProfileIntervalStarted( sal_False )
48 , bIsProfilingPerCommand( sal_False )
49 , bIsPartitioning( sal_False )
50 , bIsAutoProfiling( sal_False )
51 , pSysDepStatic( NULL )
52 {
53     InitSysdepProfiler();
54     mpStart = new ProfileSnapshot;
55     mpStart->pSysdepProfileSnapshot = NewSysdepSnapshotData();
56     mpEnd = new ProfileSnapshot;
57     mpEnd->pSysdepProfileSnapshot = NewSysdepSnapshotData();
58     StartProfileInterval();
59 }
60 
61 TTProfiler::~TTProfiler()
62 {
63     if ( IsAutoProfiling() )
64         StopAutoProfiling();
65     if ( mpStart )
66     {
67         if ( mpStart->pSysdepProfileSnapshot )
68             DeleteSysdepSnapshotData( mpStart->pSysdepProfileSnapshot );
69         delete mpStart;
70         mpStart = NULL;
71     }
72     if ( mpEnd )
73     {
74         if ( mpEnd->pSysdepProfileSnapshot )
75             DeleteSysdepSnapshotData( mpEnd->pSysdepProfileSnapshot );
76         delete mpEnd;
77         mpEnd = NULL;
78     }
79     DeinitSysdepProfiler();
80 }
81 
82 
83 String TTProfiler::GetProfileHeader()
84 {
85     UniString aReturn;
86     aReturn += '\n';
87     if ( !IsAutoProfiling() )
88         aReturn.AppendAscii("Befehl").Append(TabString(36));
89 
90     aReturn.AppendAscii("   Zeitdauer");
91     aReturn.AppendAscii("  Ticks in %");
92     aReturn.Append( GetSysdepProfileHeader() );
93     aReturn.AppendAscii("\n");
94     return aReturn;
95 }
96 
97 
98 void TTProfiler::StartProfileInterval( sal_Bool bReadAnyway )
99 {
100     if ( !bIsProfileIntervalStarted || bReadAnyway )
101     {
102         GetProfileSnapshot( mpStart );
103         GetSysdepProfileSnapshot( mpStart->pSysdepProfileSnapshot, PROFILE_START );
104         bIsProfileIntervalStarted = sal_True;
105     }
106 }
107 
108 String TTProfiler::GetProfileLine( ProfileSnapshot *pStart, ProfileSnapshot *pEnd )
109 {
110     String aProfileString;
111 
112     aProfileString += Pad(GetpApp()->GetAppLocaleDataWrapper().getDuration( DIFF( pStart, pEnd, aTime) , sal_True, sal_True ), 12);
113 
114     sal_uLong nProcessTicks = DIFF( pStart, pEnd, nProcessTicks );
115     sal_uLong nSystemTicks = DIFF( pStart, pEnd, nSystemTicks );
116     if ( nSystemTicks )
117     {
118         aProfileString += Pad(UniString::CreateFromInt32( (100 * nProcessTicks) / nSystemTicks ), 11);
119         aProfileString += '%';
120     }
121     else
122         aProfileString += Pad(CUniString("??  "), 12);
123 
124     return aProfileString;
125 }
126 
127 
128 String TTProfiler::GetProfileLine( String &aPrefix )
129 {
130     String aProfileString;
131     if ( IsProfilingPerCommand() || IsAutoProfiling() )
132     {
133         aProfileString = aPrefix;
134         aProfileString += TabString(35);
135 
136 
137         aProfileString += GetProfileLine( mpStart, mpEnd );
138         aProfileString += GetSysdepProfileLine( mpStart->pSysdepProfileSnapshot, mpEnd->pSysdepProfileSnapshot );
139         aProfileString += '\n';
140     }
141 
142     return aProfileString;
143 }
144 
145 
146 void TTProfiler::EndProfileInterval()
147 {
148     GetProfileSnapshot( mpEnd );
149     GetSysdepProfileSnapshot( mpEnd->pSysdepProfileSnapshot, PROFILE_END );
150     bIsProfileIntervalStarted = sal_False;
151 }
152 
153 
154 void TTProfiler::GetProfileSnapshot( ProfileSnapshot *pProfileSnapshot )
155 {
156     pProfileSnapshot->aTime = Time();
157     pProfileSnapshot->nProcessTicks = Time::GetProcessTicks();
158     pProfileSnapshot->nSystemTicks = Time::GetSystemTicks();
159 }
160 
161 
162 void TTProfiler::StartProfilingPerCommand()     // Jeden Befehl mitschneiden
163 {
164     bIsProfilingPerCommand = sal_True;
165 }
166 
167 void TTProfiler::StopProfilingPerCommand()
168 {
169     bIsProfilingPerCommand = sal_False;
170 }
171 
172 void TTProfiler::StartPartitioning()
173 {
174     bIsPartitioning = sal_True;
175 }
176 
177 void TTProfiler::StopPartitioning()
178 {
179     bIsPartitioning = sal_True;
180 }
181 
182 sal_uLong TTProfiler::GetPartitioningTime()
183 {
184     return DIFF( mpStart, mpEnd, nSystemTicks );
185 }
186 
187 
188 
189 void TTProfiler::StartAutoProfiling( sal_uLong nMSec )
190 {
191     if ( !bIsAutoProfiling )
192     {
193         pAutoStart = new ProfileSnapshot;
194         pAutoStart->pSysdepProfileSnapshot = NewSysdepSnapshotData();
195         pAutoEnd = new ProfileSnapshot;
196         pAutoEnd->pSysdepProfileSnapshot = NewSysdepSnapshotData();
197         GetProfileSnapshot( pAutoStart );
198         GetSysdepProfileSnapshot( pAutoStart->pSysdepProfileSnapshot, PROFILE_START );
199         SetTimeout( nMSec );
200         bIsAutoProfiling = sal_True;
201         Start();
202     }
203 
204 }
205 
206 void TTProfiler::Timeout()
207 {
208     GetProfileSnapshot( pAutoEnd );
209     GetSysdepProfileSnapshot( pAutoEnd->pSysdepProfileSnapshot, PROFILE_END );
210     String aLine;
211 
212     aLine += GetProfileLine( pAutoStart, pAutoEnd );
213     aLine += GetSysdepProfileLine( pAutoStart->pSysdepProfileSnapshot, pAutoEnd->pSysdepProfileSnapshot );
214     aLine += '\n';
215 
216     aAutoProfileBuffer += aLine;
217 
218     ProfileSnapshot *pTemp = pAutoStart;        // Tauschen, so da� jetziges Ende n�chsten Start wird
219     pAutoStart = pAutoEnd;
220     pAutoEnd = pTemp;
221 
222     Start();    // Timer neu starten
223 }
224 
225 String TTProfiler::GetAutoProfiling()
226 {
227     String aTemp(aAutoProfileBuffer);
228     aAutoProfileBuffer.Erase();
229     return aTemp;
230 }
231 
232 void TTProfiler::StopAutoProfiling()
233 {
234     if ( bIsAutoProfiling )
235     {
236         Stop();
237         bIsAutoProfiling = sal_False;
238     }
239 }
240 
241 
242 
243 //String TTProfiler::Hex( sal_uLong nNr )
244 String TTProfiler::Dec( sal_uLong nNr )
245 {
246     String aRet(UniString::CreateFromInt32(nNr));
247     if ( nNr < 100 )
248     {
249         aRet = Pad( aRet, 3);
250         aRet.SearchAndReplaceAll(' ','0');
251     }
252     aRet.Insert( ',', aRet.Len() - 2 );
253     return aRet;
254 }
255 
256 String TTProfiler::Pad( const String aS, xub_StrLen nLen )
257 {
258     if ( nLen > aS.Len() )
259         return UniString().Fill( nLen - aS.Len() ).Append( aS );
260     else
261         return CUniString(" ").Append( aS );
262 }
263 
264 
265