Annotation of parser3/src/types/pa_vstatus.C, revision 1.15.2.6.2.4
1.1 paf 1: /** @file
2: Parser: @b status class impl.
3:
1.15.2.1 paf 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.6 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.15.2.6 paf 6:
7: Win32 rusage author: Victor Fedoseev <vvf_ru@mail.ru>
1.8 paf 8: */
1.1 paf 9:
1.15.2.6.2.4! paf 10: static const char* IDENT_VSTATUS_C="$Date: 2003/03/21 13:42:34 $";
1.1 paf 11:
12: #include "pa_vstatus.h"
13: #include "pa_cache_managers.h"
1.2 paf 14: #include "pa_vhash.h"
15: #include "pa_vdouble.h"
16:
17: #ifdef HAVE_SYS_RESOURCE_H
18: // rusage
19: #include <sys/resource.h>
20: #endif
1.1 paf 21:
1.15.2.6 paf 22: #ifdef WIN32
23: #include <windows.h>
24: #include "psapi.h"
25:
26: // should be in windows.h, but were't
27: typedef struct _IO_COUNTERS_ {
28: ULONGLONG ReadOperationCount;
29: ULONGLONG WriteOperationCount;
30: ULONGLONG OtherOperationCount;
31: ULONGLONG ReadTransferCount;
32: ULONGLONG WriteTransferCount;
33: ULONGLONG OtherTransferCount;
34: } IO_COUNTERS_;
35: typedef IO_COUNTERS_ *PIO_COUNTERS_;
36:
37: typedef unsigned __int64 ui64;
38: // kernel32.dll (NT/2K/XP)
39: typedef BOOL (WINAPI *PGETPROCESSTIMES)(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME);
40: //typedef BOOL (WINAPI *PGETPROCESSHEAPS)(DWORD,PHANDLE);
41: typedef BOOL (WINAPI *GETPROCESSIOCOUNTERS)(HANDLE,PIO_COUNTERS_);
42: // psapi.dll (2K/XP)
43: typedef BOOL (WINAPI *PGETPROCESSMEMORYINFO)(HANDLE,PPROCESS_MEMORY_COUNTERS,DWORD);
44:
45: // from CRT time.c
46: /*
47: * Number of 100 nanosecond units from 1/1/1601 to 1/1/1970
48: */
49: #define EPOCH_BIAS 116444736000000000i64
50:
51: /*
52: * Union to facilitate converting from FILETIME to unsigned __int64
53: */
54: typedef union {
55: unsigned __int64 ft_scalar;
56: FILETIME ft_struct;
57: } FT;
58:
59: #endif
60:
1.15.2.6.2.3 paf 61: Value* VStatus::get_element(const String& aname, Value& /*aself*/, bool /*looking_up*/) {
1.1 paf 62: // getstatus
1.15.2.3 paf 63: if(Cache_manager* manager=cache_managers.get(aname))
1.15.2.6.2.4! paf 64: return manager->get_status();
1.1 paf 65:
66: // rusage
1.15.2.6.2.3 paf 67: if(aname=="rusage") {
1.15.2.6.2.4! paf 68: VHash& rusage=*new VHash;
! 69: HashStringValue& hash=rusage.hash();
1.15.2.6 paf 70:
71: #ifdef WIN32
72: double d1;
73: HANDLE hProc = GetCurrentProcess();
74:
75: HMODULE hMod = LoadLibrary("kernel32.dll");
76: if(hMod){
77: // NT/2K/XP
78: PGETPROCESSTIMES pGetProcessTimes = (PGETPROCESSTIMES)GetProcAddress(hMod, "GetProcessTimes");
79: if(pGetProcessTimes){
80: FILETIME CreationTime, ExitTime;
81: FT KernelTime, UserTime;
82: if(pGetProcessTimes(hProc, &CreationTime, &ExitTime, &KernelTime.ft_struct, &UserTime.ft_struct)){
83: // dwHighDateTime & dwLowDateTime - 1/10 000 000 seconds in 64 bit
84: /* the amount of time that the process has executed in user mode */
85: d1 = double((LONGLONG)UserTime.ft_scalar)/10000000.0;
1.15.2.6.2.4! paf 86: hash.put(StringBody("utime"), new VDouble(d1));
! 87: // hash.put(StringBody("UserTime"), new VDouble(d1));
1.15.2.6 paf 88:
89: /* the amount of time that the process has executed in kernel mode */
90: d1 = double((LONGLONG)KernelTime.ft_scalar)/10000000.0;
1.15.2.6.2.4! paf 91: hash.put(StringBody("stime"), new VDouble(d1));
! 92: // hash.put(StringBody("KernelTime"), new VDouble( d1));
1.15.2.6 paf 93: }
94: }
95:
96: // NT/2K/XP
97: GETPROCESSIOCOUNTERS pGetProcessIoCounters = (GETPROCESSIOCOUNTERS)GetProcAddress(hMod, "GetProcessIoCounters");
98: if(pGetProcessIoCounters){
99: IO_COUNTERS_ ioc;
100: if(pGetProcessIoCounters(hProc, &ioc)){
101: /* Specifies the number of I/O operations performed, other than read and write operations */
1.15.2.6.2.4! paf 102: hash.put(StringBody( "OtherOperationCount"),
! 103: new VDouble(double((LONGLONG)ioc.OtherOperationCount)));
1.15.2.6 paf 104: /* Specifies the number of bytes transferred during operations other than read and write operations */
1.15.2.6.2.4! paf 105: hash.put(StringBody( "OtherTransferCount"),
! 106: new VDouble(double((LONGLONG)ioc.OtherTransferCount)/1024.0));
1.15.2.6 paf 107: /* Specifies the number of read operations performed */
1.15.2.6.2.4! paf 108: hash.put(StringBody( "ReadOperationCount"),
! 109: new VDouble(double((LONGLONG)ioc.ReadOperationCount)));
1.15.2.6 paf 110: /* Specifies the number of bytes read */
1.15.2.6.2.4! paf 111: hash.put(StringBody( "ReadTransferCount"),
! 112: new VDouble(double((LONGLONG)ioc.ReadTransferCount)/1024.0));
1.15.2.6 paf 113: /* Specifies the number of write operations performed */
1.15.2.6.2.4! paf 114: hash.put(StringBody( "WriteOperationCount"),
! 115: new VDouble(double((LONGLONG)ioc.WriteOperationCount)));
1.15.2.6 paf 116: /* Specifies the number of bytes written */
1.15.2.6.2.4! paf 117: hash.put(StringBody( "WriteTransferCount"),
! 118: new VDouble(double((LONGLONG)ioc.WriteTransferCount)/1024.0));
1.15.2.6 paf 119: }
120: }
121: FreeLibrary(hMod);
122: /*
123: PGETPROCESSHEAPS pGetProcessHeaps = (PGETPROCESSHEAPS)GetProcAddress(hMod, "GetProcessHeaps");
124: if(pGetProcessHeaps){
125: }
126: */
127: }
128:
129: // 2K/XP
130: hMod = LoadLibrary("psapi.dll");
131: if(hMod){
132: PGETPROCESSMEMORYINFO pGetProcessMemoryInfo = (PGETPROCESSMEMORYINFO)GetProcAddress(hMod, "GetProcessMemoryInfo");
133: if(pGetProcessMemoryInfo){
134: PROCESS_MEMORY_COUNTERS pmc;
135: pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS);
136: if(pGetProcessMemoryInfo(hProc, &pmc, sizeof(PROCESS_MEMORY_COUNTERS))){
137: /* The peak working set size */
138: d1 = double(pmc.PeakWorkingSetSize)/1024.0;
1.15.2.6.2.4! paf 139: hash.put(StringBody("maxrss"), new VDouble(d1));
! 140: // hash.put(StringBody("PeakWorkingSetSize")), new VDouble( d1)));
1.15.2.6 paf 141: /* The peak nonpaged pool usage */
142: d1 = double(pmc.QuotaPeakNonPagedPoolUsage)/1024.0;
1.15.2.6.2.4! paf 143: // hash.put(StringBody("ixrss"), new VDouble(d1));
! 144: hash.put(StringBody("QuotaPeakNonPagedPoolUsage"), new VDouble( d1));
1.15.2.6 paf 145: /* The peak paged pool usage */
146: d1 = double(pmc.QuotaPeakPagedPoolUsage)/1024.0;
1.15.2.6.2.4! paf 147: // hash.put(StringBody("idrss"), new VDouble( d1));
! 148: hash.put(StringBody("QuotaPeakPagedPoolUsage"), new VDouble( d1));
1.15.2.6 paf 149: /* The peak pagefile usage */
150: d1 = double(pmc.PeakPagefileUsage)/1024.0;
1.15.2.6.2.4! paf 151: // hash.put(StringBody("isrss"), new VDouble( d1));
! 152: hash.put(StringBody("PeakPagefileUsage"), new VDouble( d1));
1.15.2.6 paf 153: }
154: }
155: FreeLibrary(hMod);
156: }
157:
158: // all windows.
159: FT ft;
160: GetSystemTimeAsFileTime( &(ft.ft_struct) );
161: ft.ft_scalar -= EPOCH_BIAS;
162: ui64 tv_sec = ft.ft_scalar/10000000i64;
163: ui64 tv_usec = (ft.ft_scalar-tv_sec*10000000i64)/10i64;
1.15.2.6.2.4! paf 164: hash.put(StringBody("tv_sec"), new VDouble(double((LONGLONG)tv_sec)));
! 165: hash.put(StringBody("tv_usec"), new VDouble(double((LONGLONG)tv_usec)));
1.15.2.6 paf 166:
167: #else
168:
169: #ifdef HAVE_GETRUSAGE
1.1 paf 170: struct rusage u;
1.13 paf 171: if(getrusage(RUSAGE_SELF,&u)<0)
1.7 paf 172: throw Exception(0,
1.15.2.4 paf 173: aname,
1.13 paf 174: "getrusage failed (#%d)", errno);
175:
1.15.2.6.2.4! paf 176: hash.put(StringBody("utime")), new VDouble(
1.15.2.6 paf 177: u.ru_utime.tv_sec+u.ru_utime.tv_usec/1000000.0))));
1.15.2.6.2.4! paf 178: hash.put(StringBody("stime")), new VDouble(
1.15.2.6 paf 179: u.ru_stime.tv_sec+u.ru_stime.tv_usec/1000000.0))));
1.15.2.6.2.4! paf 180: hash.put(StringBody("maxrss")), new VDouble(u.ru_maxrss))));
! 181: hash.put(StringBody("ixrss")), new VDouble(u.ru_ixrss))));
! 182: hash.put(StringBody("idrss")), new VDouble(u.ru_idrss))));
! 183: hash.put(StringBody("isrss")), new VDouble(u.ru_isrss))));
1.15.2.6 paf 184: #endif
185:
1.13 paf 186: #ifdef HAVE_GETTIMEOFDAY
187: struct timeval tp;
188: if(gettimeofday(&tp, NULL)<0)
189: throw Exception(0,
1.15.2.4 paf 190: aname,
1.13 paf 191: "gettimeofday failed (#%d)", errno);
1.1 paf 192:
1.15.2.6.2.4! paf 193: hash.put(StringBody("tv_sec")), new VDouble(tp.tv_sec))));
! 194: hash.put(StringBody("tv_usec")), new VDouble(tp.tv_usec))));
1.15.2.6 paf 195: #endif
1.13 paf 196:
197: #endif
1.1 paf 198:
1.15.2.6.2.4! paf 199: return &rusage;
1.1 paf 200: }
201:
1.15.2.6.2.3 paf 202: return 0;
1.1 paf 203: }
E-mail: