Annotation of parser3/src/types/pa_vstatus.C, revision 1.15.2.6.2.3

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.3! paf        10: static const char* IDENT_VSTATUS_C="$Date: 2003/03/20 08:11:16 $";
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.2  paf        64:                return manager->get_status(faname);
1.1       paf        65: 
                     66:        // rusage
1.15.2.6.2.3! paf        67:        if(aname=="rusage") {
        !            68:                VHash* rusage=VHash*(new VHash);
1.15.2.6  paf        69:                HashStringValue& hash=rusage->hash(aname);
                     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.3! paf        86:                                        hash.put(String* (new String("utime")),  Value*(new VDouble(d1)));
        !            87: //                                     hash.put(String* (new String("UserTime")),  Value*(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.3! paf        91:                                        hash.put(String* (new String("stime")),  Value*(new VDouble(d1)));
        !            92: //                                     hash.put(String* (new String("KernelTime")),  Value*(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.1  paf       102:                                        hash.put(String* (new String(     "OtherOperationCount")),
1.15.2.6.2.3! paf       103:                                                Value*(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.1  paf       105:                                        hash.put(String* (new String(     "OtherTransferCount")),
1.15.2.6.2.3! paf       106:                                                Value*(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.1  paf       108:                                        hash.put(String* (new String(     "ReadOperationCount")),
1.15.2.6.2.3! paf       109:                                                Value*(new VDouble(double((LONGLONG)ioc.ReadOperationCount))));
1.15.2.6  paf       110:                                        /* Specifies the number of bytes read */
1.15.2.6.2.1  paf       111:                                        hash.put(String* (new String(     "ReadTransferCount")),
1.15.2.6.2.3! paf       112:                                                Value*(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.1  paf       114:                                        hash.put(String* (new String(     "WriteOperationCount")),
1.15.2.6.2.3! paf       115:                                                Value*(new VDouble(double((LONGLONG)ioc.WriteOperationCount))));
1.15.2.6  paf       116:                                        /* Specifies the number of bytes written */
1.15.2.6.2.1  paf       117:                                        hash.put(String* (new String(     "WriteTransferCount")),
1.15.2.6.2.3! paf       118:                                                Value*(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.3! paf       139:                                        hash.put(String* (new String("maxrss")), Value*(new VDouble(d1)));
        !           140: //                                     hash.put(String* (new String("PeakWorkingSetSize")),  Value*(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.3! paf       143: //                                     hash.put(String* (new String("ixrss")), Value*(new VDouble(d1)));
        !           144:                                        hash.put(String* (new String("QuotaPeakNonPagedPoolUsage")),  Value*(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.3! paf       147: //                                     hash.put(String* (new String("idrss")),  Value*(new VDouble( d1)));
        !           148:                                        hash.put(String* (new String("QuotaPeakPagedPoolUsage")),  Value*(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.3! paf       151: //                                     hash.put(String* (new String("isrss")),  Value*(new VDouble( d1)));
        !           152:                                        hash.put(String* (new String("PeakPagefileUsage")),  Value*(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.3! paf       164:                hash.put(String* (new String("tv_sec")), Value*(new VDouble(double((LONGLONG)tv_sec))));
        !           165:                hash.put(String* (new String("tv_usec")), Value*(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.3! paf       176:                hash.put(String* (new String("utime")), Value*(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.3! paf       178:                hash.put(String* (new String("stime")), Value*(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.3! paf       180:                hash.put(String* (new String("maxrss")), Value*(new VDouble(u.ru_maxrss))));
        !           181:                hash.put(String* (new String("ixrss")), Value*(new VDouble(u.ru_ixrss))));
        !           182:                hash.put(String* (new String("idrss")), Value*(new VDouble(u.ru_idrss))));
        !           183:                hash.put(String* (new String("isrss")), Value*(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.3! paf       193:                hash.put(String* (new String("tv_sec")), Value*(new VDouble(tp.tv_sec))));
        !           194:                hash.put(String* (new String("tv_usec")), Value*(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.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: