The Gaudi Framework  v30r4 (9b837755)
Timing.cpp
Go to the documentation of this file.
1 //====================================================================
2 // Timing.cpp
3 //--------------------------------------------------------------------
4 //
5 // Package : System (The LHCb System service)
6 //
7 // Description: Implementation of Systems internals
8 //
9 // Author : M.Frank
10 // Created : 13/1/99
11 // Changes :
12 //====================================================================
13 #define GAUDIKERNEL_TIMING_CPP
14 
15 #include "GaudiKernel/Timing.h"
16 #include "ProcessDescriptor.h"
17 
18 #include <climits>
19 #include <ctime>
20 #ifdef _WIN32
21 #include <windows.h>
22 #else
23 #include <sys/time.h>
24 #include <sys/times.h>
25 #include <unistd.h>
26 #endif
27 
28 #ifdef _WIN32
29 static const long long UNIX_BASE_TIME = 116444736000000000;
30 #else
31 static const long long UNIX_BASE_TIME = 0;
32 #endif
33 
34 // convert time from internal representation to the appropriate type
35 // Internal representation for WIN32: 100 nanosecond intervals
36 // Unix: 1 clock tick (usually 10 milliseconds)
37 long long System::adjustTime( TimeType typ, long long t )
38 {
39  if ( t != -1 ) {
40 #ifndef _WIN32
41 // t /= CLK_TCK ; // needs division by clock tick unit
46 
48 #endif
49  switch ( typ ) {
50  case Year:
51  return adjustTime<Year>( t );
52  case Month:
53  return adjustTime<Month>( t );
54  case Day:
55  return adjustTime<Day>( t );
56  case Hour:
57  return adjustTime<Hour>( t );
58  case Min:
59  return adjustTime<Min>( t );
60  case Sec:
61  return adjustTime<Sec>( t );
62  case milliSec:
63  return adjustTime<milliSec>( t );
64  case microSec:
65  return adjustTime<microSec>( t );
66  case nanoSec:
67  return adjustTime<nanoSec>( t );
68  case Native:
69  return adjustTime<Native>( t );
70  }
71  }
72  return t;
73 }
74 
76 long long System::tickCount()
77 {
78  long long count = 10000;
79 #ifdef _WIN32
80  count *= ::GetTickCount(); // Number of milliSec since system startup
81 #else
82  struct tms buf;
83  count *= 10 * times( &buf );
84 #endif
85  return count;
86 }
87 
88 #include <iostream>
89 
91 long long System::currentTime( TimeType typ )
92 {
93  switch ( typ ) {
94  case Year:
95  return currentTime<Year>();
96  case Month:
97  return currentTime<Month>();
98  case Day:
99  return currentTime<Day>();
100  case Hour:
101  return currentTime<Hour>();
102  case Min:
103  return currentTime<Min>();
104  case Sec:
105  return currentTime<Sec>();
106  case milliSec:
107  return currentTime<milliSec>();
108  case microSec:
109  return currentTime<microSec>();
110  case nanoSec:
111  return currentTime<nanoSec>();
112  case Native:
113  return currentTime<Native>();
114  }
115  return currentTime<Native>();
116 }
117 
120 {
121  static long long sys_start = 0;
122  if ( 0 == sys_start ) {
123  long long c = currentTime( microSec );
124  long long t = tickCount();
125  sys_start = 10 * c - t;
126  }
127  return adjustTime( typ, sys_start );
128 }
129 
131 long long System::upTime( TimeType typ )
132 {
133  static long long sys_start = 10 * systemStart( microSec );
134  return adjustTime( typ, 10 * currentTime( microSec ) - sys_start );
135 }
136 
138 long long System::creationTime( TimeType typ, InfoType fetch, long pid )
139 {
140  long long created = 0;
141  KERNEL_USER_TIMES info;
142  if ( fetch != NoFetch && getProcess()->query( pid, fetch, &info ) ) {
143  created = adjustTime( typ, info.CreateTime - UNIX_BASE_TIME );
144  }
145  return created;
146 }
147 
149 long long System::remainingTime( TimeType typ, InfoType fetch, long pid )
150 {
151  long long left = 0;
152  QUOTA_LIMITS quota;
153  if ( fetch != NoFetch && getProcess()->query( pid, fetch, &quota ) ) {
154  if ( left == -1 ) {
155  // left = _I64_MAX;
156  } else {
157  left = adjustTime( typ, quota.TimeLimit );
158  }
159  }
160  return left;
161 }
162 
164 long long System::ellapsedTime( TimeType typ, InfoType fetch, long pid )
165 {
166  KERNEL_USER_TIMES info;
167  long long ellapsed = currentTime( microSec ) * 10;
168  getProcess()->query( pid, fetch, &info );
169  ellapsed = adjustTime( typ, ellapsed + UNIX_BASE_TIME - info.CreateTime );
170  return ellapsed;
171 }
172 
174 long long System::kernelTime( TimeType typ, InfoType fetch, long pid )
175 {
176  KERNEL_USER_TIMES info;
177  long long kerneltime = 0;
178  if ( fetch != NoFetch && getProcess()->query( pid, fetch, &info ) ) {
179  kerneltime = adjustTime( typ, info.KernelTime );
180  }
181  return kerneltime;
182 }
183 
185 long long System::userTime( TimeType typ, InfoType fetch, long pid )
186 {
187  long long usertime = 0;
188  KERNEL_USER_TIMES info;
189  if ( fetch != NoFetch && getProcess()->query( pid, fetch, &info ) ) {
190  usertime = adjustTime( typ, info.UserTime );
191  }
192  return usertime;
193 }
194 
196 long long System::cpuTime( TimeType typ, InfoType fetch, long pid )
197 {
198  long long cputime = 0;
199  KERNEL_USER_TIMES info;
200  if ( fetch != NoFetch && getProcess()->query( pid, fetch, &info ) ) {
201  cputime = adjustTime( typ, info.KernelTime + info.UserTime );
202  }
203  return cputime;
204 }
205 
206 namespace System
207 {
209  {
210  KERNEL_USER_TIMES info;
211  if ( getProcess()->query( pid, Times, &info ) ) {
212  return ProcessTime( info.KernelTime, info.UserTime, currentTime<Native>() - info.CreateTime );
213  }
214  return ProcessTime(); // return 0s in case of problems
215  }
216 }
GAUDI_API long long creationTime(TimeType typ=milliSec, InfoType fetch=Times, long pid=-1)
Process Creation time.
Definition: Timing.cpp:138
Process/Thread System and User Time NtQueryInformationProcess using ProcessTimes NtQueryInformationTh...
template long long currentTime< Month >()
Note: OS specific details for environment resolution.
Definition: Debugger.h:19
template long long currentTime< Year >()
long long adjustTime< Native >(long long t)
Definition: Timing.h:262
long long adjustTime< Month >(long long t)
Definition: Timing.h:257
template long long currentTime< Hour >()
GAUDI_API long long remainingTime(TimeType typ=milliSec, InfoType fetch=Quota, long pid=-1)
Maximum processing time left for this process.
Definition: Timing.cpp:149
long long adjustTime< nanoSec >(long long t)
Definition: Timing.h:252
GAUDI_API long long currentTime()
Retrieve absolute system time.
Definition: Timing.h:269
long long adjustTime< Day >(long long t)
Definition: Timing.h:222
TimeType
Time type for conversion.
Definition: Timing.h:58
GAUDI_API long long kernelTime(TimeType typ=milliSec, InfoType fetch=Times, long pid=-1)
CPU kernel mode time of process in milliseconds.
Definition: Timing.cpp:174
GAUDI_API long long userTime(TimeType typ=milliSec, InfoType fetch=Times, long pid=-1)
CPU user mode time of process in milliseconds.
Definition: Timing.cpp:185
long long adjustTime< milliSec >(long long t)
Definition: Timing.h:242
long long adjustTime< Year >(long long t)
Definition: Timing.h:217
Simple class to hold the time information of a process.
Definition: Timing.h:147
long long adjustTime< microSec >(long long t)
Definition: Timing.h:247
GAUDI_API long long ellapsedTime(TimeType typ=milliSec, InfoType fetch=Times, long pid=-1)
Elapsed time since start of process in milliseconds.
Definition: Timing.cpp:164
GAUDI_API long long cpuTime(TimeType typ=milliSec, InfoType fetch=Times, long pid=-1)
Consumed CPU time of process in milliseconds.
Definition: Timing.cpp:196
GAUDI_API long long tickCount()
Retrieve the number of ticks since system startup.
Definition: Timing.cpp:76
GAUDI_API long long upTime(TimeType typ=Hour)
Maximum processing time left for this process.
Definition: Timing.cpp:131
long long adjustTime< Min >(long long t)
Definition: Timing.h:232
template long long currentTime< Sec >()
template long long currentTime< Min >()
template long long currentTime< Native >()
template long long currentTime< milliSec >()
template long long currentTime< Day >()
GAUDI_API long long adjustTime(TimeType typ, long long timevalue)
Convert time from OS native time to requested representation (Experts only)
Definition: Timing.cpp:37
ProcessDescriptor * getProcess()
Retrieve Process structure.
Process Quotas NtQueryInformationProcess using ProcessQuotaLimits NtQueryInformationProcess using Pro...
long query(long pid, InfoType info, PROCESS_BASIC_INFORMATION *buffer)
GAUDI_API ProcessTime getProcessTime(long pid=-1)
Retrieve the process time data for a process.
Definition: Timing.cpp:208
long long adjustTime< Hour >(long long t)
Definition: Timing.h:227
template long long currentTime< nanoSec >()
long long adjustTime< Sec >(long long t)
Definition: Timing.h:237
template long long currentTime< microSec >()
GAUDI_API long long systemStart(TimeType typ=Sec)
Maximum processing time left for this process.
Definition: Timing.cpp:119
InfoType
Enumeration for fetching information.
Definition: SystemBase.h:19