xref: /trunk/main/automation/source/server/prof_usl.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 <procfs.h>
33 #include <tools/stream.hxx>
34 #include "profiler.hxx"
35 
36 
37 struct SysdepProfileSnapshot
38 {
39     pstatus mpstatus;
40     psinfo mpsinfo;
41     prusage mprusage;
42 };
43 
44 
45 struct SysdepStaticData
46 {
47     // Hier steht alles, was w�hrend des Profiles st�ndig gebraucht wird
48 };
49 
50 
51 void TTProfiler::InitSysdepProfiler()
52 {
53     if ( !pSysDepStatic )   // Sollte immer so sein!!
54         pSysDepStatic = new SysdepStaticData;
55     // Hier initialisieren
56 
57 };
58 
59 void TTProfiler::DeinitSysdepProfiler()
60 {
61     if ( pSysDepStatic )    // Sollte immer so sein!!
62     {
63         // Hier aufr�umen und eventuell Speicher freigeben
64 
65         delete pSysDepStatic;
66     }
67 };
68 
69 SysdepProfileSnapshot *TTProfiler::NewSysdepSnapshotData()
70 {
71     return new SysdepProfileSnapshot;
72 };
73 
74 void TTProfiler::DeleteSysdepSnapshotData( SysdepProfileSnapshot *pSysdepProfileSnapshot )
75 {
76     delete pSysdepProfileSnapshot;
77 };
78 
79 
80 // Titelzeile f�r Logdatei
81 String TTProfiler::GetSysdepProfileHeader()
82 {
83     return String::CreateFromAscii(" Size(Kb) ResidentSZ  rtime  ktime  utime  total");
84 };
85 
86 
87 // Zustand merken
88 void TTProfiler::GetSysdepProfileSnapshot( SysdepProfileSnapshot *pSysdepProfileSnapshot, sal_uInt16 )
89 {
90     SvFileStream aStream( String::CreateFromAscii("/proc/self/psinfo"), STREAM_READ );      // Das ist ein expliziter Pfad f�r UNXSOL!
91     if ( aStream.IsOpen() )
92     {
93         aStream.Read( &(pSysdepProfileSnapshot->mpsinfo), sizeof( psinfo ) );
94         aStream.Close();
95     }
96     SvFileStream anotherStream( String::CreateFromAscii("/proc/self/status"), STREAM_READ );        // Das ist ein expliziter Pfad f�r UNXSOL!
97     if ( anotherStream.IsOpen() )
98     {
99         anotherStream.Read( &(pSysdepProfileSnapshot->mpstatus), sizeof( pstatus ) );
100         anotherStream.Close();
101     }
102     SvFileStream YetAnotherStream( String::CreateFromAscii("/proc/self/usage"), STREAM_READ );      // Das ist ein expliziter Pfad f�r UNXSOL!
103     if ( YetAnotherStream.IsOpen() )
104     {
105         YetAnotherStream.Read( &(pSysdepProfileSnapshot->mprusage), sizeof( prusage ) );
106         YetAnotherStream.Close();
107     }
108 };
109 
110 #define DIFF2( aFirst, aSecond, Membername ) ( aSecond.Membername - aFirst.Membername )
111 #define CALC_MS( nSec, nNSec ) ( nSec * 1000 + (nNSec+500000) / 1000000 )
112 #define DIFF_MS( pStart, pEnd, Member ) ( CALC_MS( pEnd->Member.tv_sec, pEnd->Member.tv_nsec ) - CALC_MS( pStart->Member.tv_sec, pStart->Member.tv_nsec ) )
113 // Informationszeile zusammenbauen
114 String TTProfiler::GetSysdepProfileLine( SysdepProfileSnapshot *pStart, SysdepProfileSnapshot *pStop )
115 {
116     String aProfile;
117 
118     aProfile += Pad( String::CreateFromInt64(pStop->mpsinfo.pr_size), 9);
119     aProfile += Pad( String::CreateFromInt64(pStop->mpsinfo.pr_rssize), 11);
120 
121 
122     aProfile += Pad( String::CreateFromInt64(DIFF_MS( pStart, pStop, mprusage.pr_rtime ) / AVER( pStart, pStop, mprusage.pr_count )), 7 );
123 
124 
125     sal_uLong d_utime = DIFF_MS( pStart, pStop, mpstatus.pr_utime ) + DIFF_MS( pStart, pStop, mpstatus.pr_cutime );
126     sal_uLong d_stime = DIFF_MS( pStart, pStop, mpstatus.pr_stime ) + DIFF_MS( pStart, pStop, mpstatus.pr_cstime );
127 
128     aProfile += Pad( String::CreateFromInt64(d_utime), 7 );
129     aProfile += Pad( String::CreateFromInt64(d_stime), 7 );
130     aProfile += Pad( String::CreateFromInt64(d_utime + d_stime), 7 );
131 
132     return aProfile;
133 };
134 
135 
136 
137