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

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! paf        10: static const char* IDENT_VSTATUS_C="$Date: 2003/02/04 12:08:58 $";
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.2  paf        61: ValuePtr VStatus::get_element(StringPtr 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.2  paf        64:                return manager->get_status(fpool, aname);
1.1       paf        65: 
                     66:        // rusage
1.15.2.4  paf        67:        if(*aname=="rusage") {
                     68:                VHashPtr rusage=VHashPtr(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;
        !            86:                                        hash.put(StringPtr(new String("utime")),  ValuePtr(new VDouble(d1)));
        !            87: //                                     hash.put(StringPtr(new String("UserTime")),  ValuePtr(new VDouble( d1)));
        !            88:                                        
        !            89:                                        /* the amount of time that the process has executed in kernel mode */
        !            90:                                        d1 = double((LONGLONG)KernelTime.ft_scalar)/10000000.0;
        !            91:                                        hash.put(StringPtr(new String("stime")),  ValuePtr(new VDouble(d1)));
        !            92: //                                     hash.put(StringPtr(new String("KernelTime")),  ValuePtr(new VDouble( d1)));
        !            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 */
        !           102:                                        hash.put(StringPtr(new String(     "OtherOperationCount")),
        !           103:                                                ValuePtr(new VDouble(double((LONGLONG)ioc.OtherOperationCount))));
        !           104:                                        /* Specifies the number of bytes transferred during operations other than read and write operations */
        !           105:                                        hash.put(StringPtr(new String(     "OtherTransferCount")),
        !           106:                                                ValuePtr(new VDouble(double((LONGLONG)ioc.OtherTransferCount)/1024.0)));
        !           107:                                        /* Specifies the number of read operations performed */
        !           108:                                        hash.put(StringPtr(new String(     "ReadOperationCount")),
        !           109:                                                ValuePtr(new VDouble(double((LONGLONG)ioc.ReadOperationCount))));
        !           110:                                        /* Specifies the number of bytes read */
        !           111:                                        hash.put(StringPtr(new String(     "ReadTransferCount")),
        !           112:                                                ValuePtr(new VDouble(double((LONGLONG)ioc.ReadTransferCount)/1024.0)));
        !           113:                                        /* Specifies the number of write operations performed */
        !           114:                                        hash.put(StringPtr(new String(     "WriteOperationCount")),
        !           115:                                                ValuePtr(new VDouble(double((LONGLONG)ioc.WriteOperationCount))));
        !           116:                                        /* Specifies the number of bytes written */
        !           117:                                        hash.put(StringPtr(new String(     "WriteTransferCount")),
        !           118:                                                ValuePtr(new VDouble(double((LONGLONG)ioc.WriteTransferCount)/1024.0)));
        !           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;
        !           139:                                        hash.put(StringPtr(new String("maxrss")), ValuePtr(new VDouble(d1)));
        !           140: //                                     hash.put(StringPtr(new String("PeakWorkingSetSize")),  ValuePtr(new VDouble( d1)));
        !           141:                                        /* The peak nonpaged pool usage */
        !           142:                                        d1 = double(pmc.QuotaPeakNonPagedPoolUsage)/1024.0;
        !           143: //                                     hash.put(StringPtr(new String("ixrss")), ValuePtr(new VDouble(d1)));
        !           144:                                        hash.put(StringPtr(new String("QuotaPeakNonPagedPoolUsage")),  ValuePtr(new VDouble( d1)));
        !           145:                                        /* The peak paged pool usage */
        !           146:                                        d1 = double(pmc.QuotaPeakPagedPoolUsage)/1024.0;
        !           147: //                                     hash.put(StringPtr(new String("idrss")),  ValuePtr(new VDouble( d1)));
        !           148:                                        hash.put(StringPtr(new String("QuotaPeakPagedPoolUsage")),  ValuePtr(new VDouble( d1)));
        !           149:                                        /* The peak pagefile usage */
        !           150:                                        d1 = double(pmc.PeakPagefileUsage)/1024.0;
        !           151: //                                     hash.put(StringPtr(new String("isrss")),  ValuePtr(new VDouble( d1)));
        !           152:                                        hash.put(StringPtr(new String("PeakPagefileUsage")),  ValuePtr(new VDouble( d1)));
        !           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;
        !           164:                hash.put(StringPtr(new String("tv_sec")), ValuePtr(new VDouble(double((LONGLONG)tv_sec))));
        !           165:                hash.put(StringPtr(new String("tv_usec")), ValuePtr(new VDouble(double((LONGLONG)tv_usec))));
        !           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! paf       176:                hash.put(StringPtr(new String("utime")), ValuePtr(new VDouble(
        !           177:                        u.ru_utime.tv_sec+u.ru_utime.tv_usec/1000000.0))));
        !           178:                hash.put(StringPtr(new String("stime")), ValuePtr(new VDouble(
        !           179:                        u.ru_stime.tv_sec+u.ru_stime.tv_usec/1000000.0))));
        !           180:                hash.put(StringPtr(new String("maxrss")), ValuePtr(new VDouble(u.ru_maxrss))));
        !           181:                hash.put(StringPtr(new String("ixrss")), ValuePtr(new VDouble(u.ru_ixrss))));
        !           182:                hash.put(StringPtr(new String("idrss")), ValuePtr(new VDouble(u.ru_idrss))));
        !           183:                hash.put(StringPtr(new String("isrss")), ValuePtr(new VDouble(u.ru_isrss))));
        !           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! paf       193:                hash.put(StringPtr(new String("tv_sec")), ValuePtr(new VDouble(tp.tv_sec))));
        !           194:                hash.put(StringPtr(new String("tv_usec")), ValuePtr(new VDouble(tp.tv_usec))));
        !           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.4  paf       202:        return ValuePtr(0);
1.1       paf       203: }

E-mail: