Gaudi Framework, version v20r2

Generated: 18 Jul 2008

System::ProcessDescriptor Class Reference

#include <ProcessDescriptor.h>

Collaboration diagram for System::ProcessDescriptor:

Collaboration graph
[legend]
List of all members.

Detailed Description

Provides access to process information.

Author:
M.Frank

Sebastien Ponce

Definition at line 110 of file ProcessDescriptor.h.

Public Member Functions

 ProcessDescriptor ()
virtual ~ProcessDescriptor ()
long query (long pid, InfoType info, PROCESS_BASIC_INFORMATION *buffer)
long query (long pid, InfoType info, POOLED_USAGE_AND_LIMITS *buffer)
long query (long pid, InfoType info, KERNEL_USER_TIMES *buffer)
long query (long pid, InfoType info, QUOTA_LIMITS *buffer)
long query (long pid, InfoType info, VM_COUNTERS *buffer)
long query (long pid, InfoType info, IO_COUNTERS *buffer)
long query (long pid, InfoType info, long *buffer)

Private Attributes

long m_PRIORITYBOOST [2]
IO_COUNTERS m_IO_COUNTERS [2]
VM_COUNTERS m_VM_COUNTERS [2]
KERNEL_USER_TIMES m_KERNEL_USER_TIMES [2]
POOLED_USAGE_AND_LIMITS m_POOLED_USAGE_AND_LIMITS [2]
QUOTA_LIMITS m_QUOTA_LIMITS [2]
PROCESS_BASIC_INFORMATION m_PROCESS_BASIC_INFORMATION [2]

Classes

class  ProcessHandle


Constructor & Destructor Documentation

System::ProcessDescriptor::ProcessDescriptor (  ) 

Definition at line 256 of file ProcessDescriptor.cpp.

00257 {
00258 }

System::ProcessDescriptor::~ProcessDescriptor (  )  [virtual]

Definition at line 260 of file ProcessDescriptor.cpp.

00260                                               {
00261 }


Member Function Documentation

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
PROCESS_BASIC_INFORMATION buffer 
)

Definition at line 463 of file ProcessDescriptor.cpp.

References linux_proc::flags, System::ProcessDescriptor::ProcessHandle::handle(), System::ProcessDescriptor::ProcessHandle::item(), m_PROCESS_BASIC_INFORMATION, linux_proc::ppid, linux_proc::priority, System::ProcessBasicInformation, System::ProcessBasics, processID(), readProcStat(), and linux_proc::startcode.

Referenced by System::ellapsedTime().

00465                                                                           {
00466   long status = 1;
00467   ProcessHandle h(pid);
00468   PROCESS_BASIC_INFORMATION* vb = &m_PROCESS_BASIC_INFORMATION[h.item()];
00469   if ( fetch == ProcessBasics )   {
00470 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00471     status = NtApi::NtQueryInformationProcess(h.handle(),
00472                                               ProcessBasicInformation,
00473                                               vb,
00474                                               sizeof(PROCESS_BASIC_INFORMATION),
00475                                               0);
00476     status = (status==0) ? 1 : 0;
00477 #elif _WIN32                              // Windows 95,98...
00478 #elif defined(linux)                      // Linux
00479     linux_proc prc;
00480     readProcStat( processID(pid), prc);
00481     vb->ExitStatus                   = 0;
00482     vb->PebBaseAddress               = (PPEB)prc.startcode;
00483     vb->BasePriority                 = 2*15-prc.priority;
00484     // std::cout << "Base Priority=" << vb->BasePriority << "|"
00485     // << prc.priority << std::endl;
00486     vb->AffinityMask                 = prc.flags;
00487     // std::cout << "Flags        =" << vb->AffinityMask << "|"
00488     // << prc.flags << std::endl;
00489     vb->UniqueProcessId              = processID(pid);
00490     vb->InheritedFromUniqueProcessId = prc.ppid;
00491 #else                                     // All Other
00492 #endif                                    // End ALL OS
00493   }
00494   if ( info ) *info = *vb;
00495   return status;
00496 }

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
POOLED_USAGE_AND_LIMITS buffer 
)

Definition at line 296 of file ProcessDescriptor.cpp.

References System::ProcessDescriptor::ProcessHandle::handle(), System::ProcessDescriptor::ProcessHandle::item(), m_POOLED_USAGE_AND_LIMITS, pg_size, processID(), System::ProcessPooledUsageAndLimits, System::Quota, readProcStat(), and linux_proc::rss.

00298                                                                         {
00299   long status = 1;
00300   ProcessHandle h(pid);
00301   POOLED_USAGE_AND_LIMITS* vb = &m_POOLED_USAGE_AND_LIMITS[h.item()];
00302   if ( fetch == Quota )   {
00303 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00304     status = NtApi::NtQueryInformationProcess(h.handle(),
00305                                               ProcessPooledUsageAndLimits,
00306                                               vb,
00307                                               sizeof(POOLED_USAGE_AND_LIMITS),
00308                                               0);
00309     status = (status==0) ? 1 : 0;
00310 #elif _WIN32                              // Windows 95,98...
00311 #elif defined(linux)                      // Linux
00312     //rusage usage;
00313     //getrusage(RUSAGE_SELF, &usage);
00314     rlimit lim;
00315 
00316     getrlimit(RLIMIT_DATA, &lim);
00317     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00318     vb->PeakPagedPoolUsage = lim.rlim_cur;
00319     vb->PagedPoolUsage     = lim.rlim_cur;
00320     vb->PagedPoolLimit     = lim.rlim_max;
00321 
00322     getrlimit(RLIMIT_STACK, &lim);
00323     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00324     vb->PeakNonPagedPoolUsage = lim.rlim_cur;
00325     vb->NonPagedPoolUsage     = lim.rlim_cur;
00326     vb->NonPagedPoolLimit     = lim.rlim_max;
00327 
00328     linux_proc prc;
00329     readProcStat(processID(pid), prc);
00330     vb->PeakPagefileUsage     = prc.rss * pg_size;
00331     vb->PagefileUsage         = prc.rss * pg_size;
00332     vb->PagefileLimit         = 0xFFFFFFFF;
00333 #elif defined(__APPLE__)
00334 #else                                     // All Other
00335 #endif                                    // End ALL OS
00336   }
00337   if ( info ) *info = *vb;
00338   return status;
00339 }

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
KERNEL_USER_TIMES buffer 
)

Definition at line 498 of file ProcessDescriptor.cpp.

References System::ProcessDescriptor::ProcessHandle::handle(), System::ProcessDescriptor::ProcessHandle::item(), m_KERNEL_USER_TIMES, processID(), System::ProcessTimes, readProcStat(), s_myPid, linux_proc::starttime, TICK_TO_100NSEC, and System::Times.

00500                                                                  {
00501   long status = 1;
00502   ProcessHandle h(pid);
00503   KERNEL_USER_TIMES* tb = &m_KERNEL_USER_TIMES[h.item()];;
00504   if ( fetch == Times )   {
00505 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00506     status = NtApi::NtQueryInformationProcess(h.handle(),
00507                                               ProcessTimes,
00508                                               tb,
00509                                               sizeof(KERNEL_USER_TIMES),
00510                                               0);
00511     status = (status==0) ? 1 : 0;
00512 #elif defined(_WIN32)                     // Windows 95,98...
00513 #elif defined(linux)                      // Linux
00514     // prc.startup is in ticks since system start :
00515     // need to offset for absolute time
00516     tms tmsb;
00517     static longlong prc_start = 0;
00518     //    static longlong offset = 100*longlong(time(0)) - longlong(times(0));
00519     static longlong offset = 100*longlong(time(0)) - longlong(times(&tmsb));
00520     if ( processID(pid) == s_myPid && prc_start == 0 ) {
00521       linux_proc prc;
00522       readProcStat( processID(pid), prc);
00523       prc_start = prc.starttime+offset;
00524     }
00525 
00526     if ( processID(pid) == s_myPid ) {
00527       struct rusage r;
00528       getrusage( RUSAGE_SELF, &r );
00529       const double utime = static_cast<double>(r.ru_utime.tv_sec )*1e6 +
00530                            static_cast<double>(r.ru_utime.tv_usec);
00531       const double stime = static_cast<double>(r.ru_stime.tv_sec )*1e6 +
00532                            static_cast<double>(r.ru_stime.tv_usec);
00533       tb->UserTime   = static_cast<longlong>( utime * 10. );
00534       tb->KernelTime = static_cast<longlong>( stime * 10. );
00535       tb->CreateTime = prc_start;
00536     }
00537     else {
00538       linux_proc prc;
00539       readProcStat( processID(pid), prc );
00540 
00541       tms t;
00542       times(&t);
00543       tb->UserTime   = t.tms_utime * TICK_TO_100NSEC;
00544       tb->KernelTime = t.tms_stime * TICK_TO_100NSEC;
00545       tb->CreateTime = (prc.starttime+offset);
00546     }
00547     tb->CreateTime *= TICK_TO_100NSEC;
00548     tb->ExitTime    = 0;
00549 
00550     status = 1;
00551 
00552 #elif defined(__APPLE__)
00553     // FIXME (MCl): Make an alternative function get timing on OSX
00554     // times() seems to cause a segmentation fault 
00555 #else  // no /proc file system: assume sys_start for the first call
00556     tms tmsb;
00557     static clock_t sys_start = times(0);
00558     static longlong offset = 100*longlong(time(0)) - sys_start;
00559     clock_t now = times(&tmsb);
00560     tb->CreateTime    = offset + now;
00561     tb->UserTime      = tmsb.tms_utime;
00562     tb->KernelTime    = tmsb.tms_stime;
00563     tb->CreateTime   *= TICK_TO_100NSEC;
00564     tb->UserTime     *= TICK_TO_100NSEC;
00565     tb->KernelTime   *= TICK_TO_100NSEC;
00566     tb->ExitTime      = 0;
00567     status = 1;
00568 #endif
00569   }
00570   if ( info ) *info = *tb;
00571   return status;
00572 }

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
QUOTA_LIMITS buffer 
)

Definition at line 416 of file ProcessDescriptor.cpp.

References System::ProcessDescriptor::ProcessHandle::handle(), System::ProcessDescriptor::ProcessHandle::item(), m_QUOTA_LIMITS, System::ProcessQuotaLimits, and System::Quota.

00418                                                              {
00419   long status = 1;
00420   ProcessHandle h(pid);
00421   QUOTA_LIMITS* vb = &m_QUOTA_LIMITS[h.item()];
00422   if ( fetch == Quota )   {
00423 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00424     status = NtApi::NtQueryInformationProcess(h.handle(),
00425                                               ProcessQuotaLimits,
00426                                               vb,
00427                                               sizeof(QUOTA_LIMITS),
00428                                               0);
00429     status = (status==0) ? 1 : 0;
00430 #elif _WIN32                              // Windows 95,98...
00431 #elif defined(linux)                      // Linux
00432     // On linux all this stuff typically is not set
00433     // (ie. rlim_max=RLIM_INFINITY...)
00434     rlimit lim;
00435     getrlimit(RLIMIT_DATA, &lim);
00436     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00437     vb->PagedPoolLimit        = lim.rlim_max;
00438 
00439     getrlimit(RLIMIT_STACK, &lim);
00440     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00441     vb->NonPagedPoolLimit     = lim.rlim_max;
00442     vb->MinimumWorkingSetSize = 0;
00443 
00444     getrlimit(RLIMIT_RSS, &lim);
00445     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00446     vb->MaximumWorkingSetSize = lim.rlim_max;
00447 
00448     getrlimit(RLIMIT_AS, &lim);
00449     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00450     vb->PagefileLimit         = lim.rlim_max;
00451 
00452     getrlimit(RLIMIT_CPU, &lim);
00453     if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF;
00454     vb->TimeLimit             = lim.rlim_max;
00455 #elif defined(__APPLE__)
00456 #else                                     // All Other
00457 #endif                                    // End ALL OS
00458   }
00459   if ( info ) *info = *vb;
00460   return status;
00461 }

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
VM_COUNTERS buffer 
)

Definition at line 371 of file ProcessDescriptor.cpp.

References System::ProcessDescriptor::ProcessHandle::handle(), System::ProcessDescriptor::ProcessHandle::item(), m_VM_COUNTERS, linux_proc::majflt, System::Memory, linux_proc::minflt, pg_size, processID(), System::ProcessVmCounters, readProcStat(), and linux_proc::vsize.

00373                                                             {
00374   long status = 1;
00375   ProcessHandle h(pid);
00376   VM_COUNTERS* vb = &m_VM_COUNTERS[h.item()];
00377   if ( fetch == Memory )   {
00378 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00379     status = NtApi::NtQueryInformationProcess(h.handle(),
00380                                               ProcessVmCounters,
00381                                               vb,
00382                                               sizeof(VM_COUNTERS),
00383                                               0);
00384     status = (status==0) ? 1 : 0;
00385 #elif _WIN32                              // Windows 95,98...
00386 #elif defined(linux)                      // Linux
00387     char buf[1024];
00388     sprintf(buf,"/proc/%ld/statm", processID(pid));
00389     long size, resident, share, trs, lrs, drs, dt;
00390     int fd = open(buf,O_RDONLY);
00391     read(fd, buf, sizeof(buf));  
00392     close(fd);
00393     fd = sscanf(buf, "%ld %ld %ld %ld %ld %ld %ld",
00394                      &size, &resident, &share, &trs, &drs, &lrs, &dt);
00395     linux_proc prc;
00396     readProcStat( processID(pid), prc);
00397     vb->PeakVirtualSize            = prc.vsize;
00398     vb->VirtualSize                = prc.vsize;
00399     vb->PeakWorkingSetSize         = resident * pg_size;
00400     vb->WorkingSetSize             = resident * pg_size;
00401     vb->QuotaPeakPagedPoolUsage    = share    * pg_size;
00402     vb->QuotaPagedPoolUsage        = share    * pg_size;
00403     vb->QuotaNonPagedPoolUsage     = (trs+drs)* pg_size;// drs = data/stack size
00404     vb->QuotaPeakNonPagedPoolUsage = (trs+drs)* pg_size;// trs = VmExe size
00405     vb->PageFaultCount             = prc.majflt + prc.minflt;
00406     vb->PagefileUsage              = prc.vsize-resident*pg_size;
00407     vb->PeakPagefileUsage          = prc.vsize-resident*pg_size;
00408 #elif defined(__APPLE__)
00409 #else                                     // All Other
00410 #endif                                    // End ALL OS
00411   }
00412   if ( info ) *info = *vb;
00413   return status;
00414 }

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
IO_COUNTERS buffer 
)

Definition at line 263 of file ProcessDescriptor.cpp.

References System::ProcessDescriptor::ProcessHandle::handle(), System::IO, System::ProcessDescriptor::ProcessHandle::item(), m_IO_COUNTERS, processID(), System::ProcessIoCounters, and readProcStat().

00265                                                          {
00266   long status = 1;
00267   ProcessHandle h(pid);
00268   IO_COUNTERS* vb = &m_IO_COUNTERS[h.item()];
00269   if ( fetch == IO )   {
00270 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00271     status = NtApi::NtQueryInformationProcess(h.handle(),
00272                                               ProcessIoCounters,
00273                                               vb,
00274                                               sizeof(IO_COUNTERS),
00275                                               0);
00276     status = (status==0) ? 1 : 0;
00277 #elif _WIN32                              // Windows 95,98...
00278 #elif defined(linux)
00279     linux_proc prc;
00280     readProcStat(processID(pid), prc);
00281     rusage usage;
00282     getrusage(RUSAGE_SELF, &usage);
00283     vb->ReadOperationCount    = usage.ru_inblock;
00284     vb->WriteOperationCount   = usage.ru_oublock;
00285     vb->OtherOperationCount   = 0;
00286     vb->ReadTransferCount     = usage.ru_inblock;
00287     vb->WriteTransferCount    = usage.ru_oublock;
00288     vb->OtherTransferCount    = 0;
00289 #else                                     // All Other
00290 #endif                                    // End ALL OS
00291   }
00292   if ( info ) *info = *vb;
00293   return status;
00294 }

long System::ProcessDescriptor::query ( long  pid,
InfoType  info,
long *  buffer 
)

Definition at line 341 of file ProcessDescriptor.cpp.

References System::ProcessDescriptor::ProcessHandle::handle(), System::ProcessDescriptor::ProcessHandle::item(), m_PRIORITYBOOST, System::PriorityBoost, and System::ProcessPriorityBoost.

00341                                                                            {
00342   long status = 1, *vb = &status;
00343   ProcessHandle h(pid);
00344   vb = &m_PRIORITYBOOST[h.item()];
00345   *vb = 0;
00346   switch ( fetch )    {
00347   case PriorityBoost:
00348 #if defined(_WIN32) && WINVER>=0x0400     // Windows NT
00349     status = NtApi::NtQueryInformationProcess(h.handle(),
00350                                               ProcessPriorityBoost,
00351                                               vb,
00352                                               sizeof(long),
00353                                               0);
00354 #elif _WIN32                              // Windows 95,98...
00355 #else
00356     // Not applicable
00357     status = 0;
00358     *vb = 0;
00359 #endif                                    // End ALL OS
00360     status = (status==0) ? 1 : 0;
00361     break;
00362   default:
00363     status = -1;
00364     vb = &status;
00365     break;
00366   }
00367   if ( info ) *info = *vb;
00368   return status;
00369 }


Member Data Documentation

long System::ProcessDescriptor::m_PRIORITYBOOST[2] [private]

Definition at line 124 of file ProcessDescriptor.h.

Referenced by query().

IO_COUNTERS System::ProcessDescriptor::m_IO_COUNTERS[2] [private]

Definition at line 125 of file ProcessDescriptor.h.

Referenced by query().

VM_COUNTERS System::ProcessDescriptor::m_VM_COUNTERS[2] [private]

Definition at line 126 of file ProcessDescriptor.h.

Referenced by query().

KERNEL_USER_TIMES System::ProcessDescriptor::m_KERNEL_USER_TIMES[2] [private]

Definition at line 127 of file ProcessDescriptor.h.

Referenced by query().

POOLED_USAGE_AND_LIMITS System::ProcessDescriptor::m_POOLED_USAGE_AND_LIMITS[2] [private]

Definition at line 128 of file ProcessDescriptor.h.

Referenced by query().

QUOTA_LIMITS System::ProcessDescriptor::m_QUOTA_LIMITS[2] [private]

Definition at line 129 of file ProcessDescriptor.h.

Referenced by query().

PROCESS_BASIC_INFORMATION System::ProcessDescriptor::m_PROCESS_BASIC_INFORMATION[2] [private]

Definition at line 130 of file ProcessDescriptor.h.

Referenced by query().


The documentation for this class was generated from the following files:
Generated at Fri Jul 18 12:11:18 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004