|
Gaudi Framework, version v21r9 |
| Home | Generated: 3 May 2010 |
#include <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 |
Definition at line 110 of file ProcessDescriptor.h.
| System::ProcessDescriptor::ProcessDescriptor | ( | ) |
| System::ProcessDescriptor::~ProcessDescriptor | ( | ) | [virtual] |
| long System::ProcessDescriptor::query | ( | long | pid, | |
| InfoType | info, | |||
| PROCESS_BASIC_INFORMATION * | buffer | |||
| ) |
Definition at line 466 of file ProcessDescriptor.cpp.
00468 { 00469 long status = 1; 00470 ProcessHandle h(pid); 00471 PROCESS_BASIC_INFORMATION* vb = &m_PROCESS_BASIC_INFORMATION[h.item()]; 00472 if ( fetch == ProcessBasics ) { 00473 #if defined(_WIN32) && WINVER>=0x0400 // Windows NT 00474 status = NtApi::NtQueryInformationProcess(h.handle(), 00475 ProcessBasicInformation, 00476 vb, 00477 sizeof(PROCESS_BASIC_INFORMATION), 00478 0); 00479 status = (status==0) ? 1 : 0; 00480 #elif defined(_WIN32) // Windows 95,98... 00481 #elif defined(linux) // Linux 00482 linux_proc prc; 00483 readProcStat( processID(pid), prc); 00484 vb->ExitStatus = 0; 00485 vb->PebBaseAddress = (PPEB)prc.startcode; 00486 vb->BasePriority = 2*15-prc.priority; 00487 // std::cout << "Base Priority=" << vb->BasePriority << "|" 00488 // << prc.priority << std::endl; 00489 vb->AffinityMask = prc.flags; 00490 // std::cout << "Flags =" << vb->AffinityMask << "|" 00491 // << prc.flags << std::endl; 00492 vb->UniqueProcessId = processID(pid); 00493 vb->InheritedFromUniqueProcessId = prc.ppid; 00494 #else // All Other 00495 #endif // End ALL OS 00496 } 00497 if ( info ) *info = *vb; 00498 return status; 00499 }
| long System::ProcessDescriptor::query | ( | long | pid, | |
| InfoType | info, | |||
| POOLED_USAGE_AND_LIMITS * | buffer | |||
| ) |
Definition at line 296 of file ProcessDescriptor.cpp.
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 defined(_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 501 of file ProcessDescriptor.cpp.
00503 { 00504 long status = 1; 00505 ProcessHandle h(pid); 00506 KERNEL_USER_TIMES* tb = &m_KERNEL_USER_TIMES[h.item()];; 00507 if ( fetch == Times ) { 00508 #if defined(_WIN32) && WINVER>=0x0400 // Windows NT 00509 status = NtApi::NtQueryInformationProcess(h.handle(), 00510 ProcessTimes, 00511 tb, 00512 sizeof(KERNEL_USER_TIMES), 00513 0); 00514 status = (status==0) ? 1 : 0; 00515 #elif defined(_WIN32) // Windows 95,98... 00516 #elif defined(linux) // Linux 00517 // prc.startup is in ticks since system start : 00518 // need to offset for absolute time 00519 tms tmsb; 00520 static longlong prc_start = 0; 00521 // static longlong offset = 100*longlong(time(0)) - longlong(times(0)); 00522 static longlong offset = 100*longlong(time(0)) - longlong(times(&tmsb)); 00523 if ( processID(pid) == s_myPid && prc_start == 0 ) { 00524 linux_proc prc; 00525 readProcStat( processID(pid), prc); 00526 prc_start = prc.starttime+offset; 00527 } 00528 00529 if ( processID(pid) == s_myPid ) { 00530 struct rusage r; 00531 getrusage( RUSAGE_SELF, &r ); 00532 tb->UserTime = (static_cast<long long>(r.ru_utime.tv_sec) * 1000000 + 00533 r.ru_utime.tv_usec) * 10; 00534 tb->KernelTime = (static_cast<long long>(r.ru_stime.tv_sec) * 1000000 + 00535 r.ru_stime.tv_usec) * 10; 00536 tb->CreateTime = prc_start; 00537 } 00538 else { 00539 linux_proc prc; 00540 readProcStat( processID(pid), prc ); 00541 00542 tms t; 00543 times(&t); 00544 tb->UserTime = t.tms_utime * TICK_TO_100NSEC; 00545 tb->KernelTime = t.tms_stime * TICK_TO_100NSEC; 00546 tb->CreateTime = (prc.starttime+offset); 00547 } 00548 tb->CreateTime *= TICK_TO_100NSEC; 00549 tb->ExitTime = 0; 00550 00551 status = 1; 00552 00553 #elif defined(__APPLE__) 00554 // FIXME (MCl): Make an alternative function get timing on OSX 00555 // times() seems to cause a segmentation fault 00556 #else // no /proc file system: assume sys_start for the first call 00557 tms tmsb; 00558 static clock_t sys_start = times(0); 00559 static longlong offset = 100*longlong(time(0)) - sys_start; 00560 clock_t now = times(&tmsb); 00561 tb->CreateTime = offset + now; 00562 tb->UserTime = tmsb.tms_utime; 00563 tb->KernelTime = tmsb.tms_stime; 00564 tb->CreateTime *= TICK_TO_100NSEC; 00565 tb->UserTime *= TICK_TO_100NSEC; 00566 tb->KernelTime *= TICK_TO_100NSEC; 00567 tb->ExitTime = 0; 00568 status = 1; 00569 #endif 00570 } 00571 if ( info ) *info = *tb; 00572 return status; 00573 }
| long System::ProcessDescriptor::query | ( | long | pid, | |
| InfoType | info, | |||
| QUOTA_LIMITS * | buffer | |||
| ) |
Definition at line 419 of file ProcessDescriptor.cpp.
00421 { 00422 long status = 1; 00423 ProcessHandle h(pid); 00424 QUOTA_LIMITS* vb = &m_QUOTA_LIMITS[h.item()]; 00425 if ( fetch == Quota ) { 00426 #if defined(_WIN32) && WINVER>=0x0400 // Windows NT 00427 status = NtApi::NtQueryInformationProcess(h.handle(), 00428 ProcessQuotaLimits, 00429 vb, 00430 sizeof(QUOTA_LIMITS), 00431 0); 00432 status = (status==0) ? 1 : 0; 00433 #elif defined(_WIN32) // Windows 95,98... 00434 #elif defined(linux) // Linux 00435 // On linux all this stuff typically is not set 00436 // (ie. rlim_max=RLIM_INFINITY...) 00437 rlimit lim; 00438 getrlimit(RLIMIT_DATA, &lim); 00439 if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF; 00440 vb->PagedPoolLimit = lim.rlim_max; 00441 00442 getrlimit(RLIMIT_STACK, &lim); 00443 if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF; 00444 vb->NonPagedPoolLimit = lim.rlim_max; 00445 vb->MinimumWorkingSetSize = 0; 00446 00447 getrlimit(RLIMIT_RSS, &lim); 00448 if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF; 00449 vb->MaximumWorkingSetSize = lim.rlim_max; 00450 00451 getrlimit(RLIMIT_AS, &lim); 00452 if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF; 00453 vb->PagefileLimit = lim.rlim_max; 00454 00455 getrlimit(RLIMIT_CPU, &lim); 00456 if ( lim.rlim_max == RLIM_INFINITY ) lim.rlim_max = 0xFFFFFFFF; 00457 vb->TimeLimit = lim.rlim_max; 00458 #elif defined(__APPLE__) 00459 #else // All Other 00460 #endif // End ALL OS 00461 } 00462 if ( info ) *info = *vb; 00463 return status; 00464 }
| long System::ProcessDescriptor::query | ( | long | pid, | |
| InfoType | info, | |||
| VM_COUNTERS * | buffer | |||
| ) |
Definition at line 371 of file ProcessDescriptor.cpp.
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 defined(_WIN32) // Windows 95,98... 00386 #elif defined(linux) // Linux 00387 const ssize_t bufsize = 1024; 00388 char buf[bufsize]; 00389 sprintf(buf,"/proc/%ld/statm", processID(pid)); 00390 long size, resident, share, trs, lrs, drs, dt; 00391 int fd = open(buf,O_RDONLY); 00392 ssize_t nread = read(fd, buf, bufsize); 00393 close(fd); 00394 if ( nread < bufsize && nread >= 0 ) 00395 buf[nread]='\0'; 00396 fd = sscanf(buf, "%ld %ld %ld %ld %ld %ld %ld", 00397 &size, &resident, &share, &trs, &drs, &lrs, &dt); 00398 linux_proc prc; 00399 readProcStat( processID(pid), prc); 00400 vb->PeakVirtualSize = prc.vsize; 00401 vb->VirtualSize = prc.vsize; 00402 vb->PeakWorkingSetSize = resident * pg_size; 00403 vb->WorkingSetSize = resident * pg_size; 00404 vb->QuotaPeakPagedPoolUsage = share * pg_size; 00405 vb->QuotaPagedPoolUsage = share * pg_size; 00406 vb->QuotaNonPagedPoolUsage = (trs+drs)* pg_size;// drs = data/stack size 00407 vb->QuotaPeakNonPagedPoolUsage = (trs+drs)* pg_size;// trs = VmExe size 00408 vb->PageFaultCount = prc.majflt + prc.minflt; 00409 vb->PagefileUsage = prc.vsize-resident*pg_size; 00410 vb->PeakPagefileUsage = prc.vsize-resident*pg_size; 00411 #elif defined(__APPLE__) 00412 #else // All Other 00413 #endif // End ALL OS 00414 } 00415 if ( info ) *info = *vb; 00416 return status; 00417 }
| long System::ProcessDescriptor::query | ( | long | pid, | |
| InfoType | info, | |||
| IO_COUNTERS * | buffer | |||
| ) |
Definition at line 263 of file ProcessDescriptor.cpp.
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 defined(_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 }
Definition at line 341 of file ProcessDescriptor.cpp.
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 defined(_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 }
long System::ProcessDescriptor::m_PRIORITYBOOST[2] [private] |
Definition at line 124 of file ProcessDescriptor.h.
IO_COUNTERS System::ProcessDescriptor::m_IO_COUNTERS[2] [private] |
Definition at line 125 of file ProcessDescriptor.h.
VM_COUNTERS System::ProcessDescriptor::m_VM_COUNTERS[2] [private] |
Definition at line 126 of file ProcessDescriptor.h.
Definition at line 127 of file ProcessDescriptor.h.
Definition at line 128 of file ProcessDescriptor.h.
QUOTA_LIMITS System::ProcessDescriptor::m_QUOTA_LIMITS[2] [private] |
Definition at line 129 of file ProcessDescriptor.h.
Definition at line 130 of file ProcessDescriptor.h.