49 #include <sys/procfs.h> 51 #include <sys/pstat.h> 54 #elif defined(UNIXWARE7) 55 #include <sys/procfs.h> 57 #elif defined(LINUX) || defined(ALPHA_LINUX) 61 #include <sys/procfs.h> 64 #include <sys/procfs.h> 74 #define GETSIZE_PATH "getsize" 76 #if defined(LINUX) || defined(ALPHA_LINUX) 77 static char *skip_token (
char *
p);
81 #define IS_COUNTER_VALUE_PTR_NULL() \ 82 (cntvalue_pid == NULL || cntvalue_workset == NULL || \ 83 cntvalue_pct_cpu == NULL || cntvalue_num_thr == NULL) 85 static void alloc_counter_value ();
87 typedef PDH_STATUS (__stdcall * PDHOpenQuery) (LPCSTR, DWORD_PTR, PDH_HQUERY *);
88 typedef PDH_STATUS (__stdcall * PDHCloseQuery) (PDH_HQUERY);
89 typedef PDH_STATUS (__stdcall * PDHAddCounter) (PDH_HQUERY, LPCSTR, DWORD_PTR, PDH_HCOUNTER *);
90 typedef PDH_STATUS (__stdcall * PDHCollectQueryData) (PDH_HQUERY);
91 typedef PDH_STATUS (__stdcall * PDHGetFormattedCounterArray) (PDH_HCOUNTER, DWORD, LPDWORD, LPDWORD,
92 PPDH_FMT_COUNTERVALUE_ITEM_A);
93 PDHOpenQuery fp_PdhOpenQuery;
94 PDHCloseQuery fp_PdhCloseQuery;
95 PDHAddCounter fp_PdhAddCounter;
96 PDHCollectQueryData fp_PdhCollectQueryData;
97 PDHGetFormattedCounterArray fp_PdhGetFormattedCounterArray;
100 HCOUNTER counter_pct_cpu;
101 HCOUNTER counter_workset;
102 HCOUNTER counter_num_thr;
103 PDH_FMT_COUNTERVALUE_ITEM *cntvalue_pid =
NULL;
104 PDH_FMT_COUNTERVALUE_ITEM *cntvalue_pct_cpu =
NULL;
105 PDH_FMT_COUNTERVALUE_ITEM *cntvalue_workset =
NULL;
106 PDH_FMT_COUNTERVALUE_ITEM *cntvalue_num_thr =
NULL;
108 int num_counter_value;
109 unsigned long pdh_num_proc;
118 struct prpsinfo info;
119 const char *procdir =
"/proc";
127 sprintf (pname,
"%s/%05d", procdir, pid);
130 if ((procfd = open (pname, O_RDONLY)) == -1)
135 if (ioctl (procfd, PIOCPSINFO, (
char *) &info) == -1)
140 if (saverr == EAGAIN)
144 if (saverr != ENOENT)
153 return (
int) (info.pr_bysize / 1024);
161 struct pst_status info;
168 if (HP_PSTAT_GETPROC (&info, pid) < 0)
177 psize = info.pst_vdsize + info.pst_vtsize + info.pst_vssize;
178 psize *= (page_size / 1024);
179 return (
int) (psize);
185 struct procentry64 entry;
186 int page_size = sysconf (_SC_PAGESIZE);
194 if (getprocs64 (&entry,
sizeof (entry),
NULL, 0, &tmp_pid, 1) < 0)
196 if (kill (pid, 0) < 0)
205 if (entry.pi_pid != pid)
210 return (
int) (((INT64) entry.pi_dvm) * ((INT64) page_size) / 1024);
212 #elif defined(UNIXWARE7) 220 int page_size = sysconf (_SC_PAGESIZE);
227 sprintf (proc_file,
"/proc/%d/psinfo", pid);
228 fd = open (proc_file, O_RDONLY);
234 read_len = read (fd, &pinfo,
sizeof (pinfo));
236 if (read_len <
sizeof (pinfo))
240 if (pinfo.pr_size <= 0)
245 return (
int) (((INT64) pinfo.pr_size) * ((INT64) page_size) / 1024);
247 #elif defined(LINUX) || defined(ALPHA_LINUX) 262 sprintf (buf,
"/proc/%d/stat", pid);
263 fd = open (buf, O_RDONLY);
269 read_len = read (fd, buf,
sizeof (buf) - 1);
272 if (read_len < 0 || read_len >= (
int)
sizeof (buf))
276 buf[read_len] =
'\0';
278 p = strchr (buf,
')');
280 for (i = 0; i < 20; i++)
286 return (
int) (psize / 1024);
294 while (*p && !isspace (*p))
302 int page_size = sysconf (_SC_PAGESIZE);
304 struct prpsinfo info;
305 const char *procdir =
"/proc";
313 sprintf (pname,
"%s/%05d", procdir, pid);
316 if ((procfd = open (pname, O_RDONLY)) == -1)
321 if (ioctl (procfd, PIOCPSINFO, (
char *) &info) == -1)
326 if (saverr == EAGAIN)
330 if (saverr != ENOENT)
339 return (
int) (((INT64) info.pr_size) * ((INT64) page_size) / 1024);
341 #elif defined(WINDOWS) 343 alloc_counter_value ()
345 PDH_FMT_COUNTERVALUE_ITEM *tmp_pid =
NULL;
346 PDH_FMT_COUNTERVALUE_ITEM *tmp_cpu =
NULL;
347 PDH_FMT_COUNTERVALUE_ITEM *tmp_workset =
NULL;
348 PDH_FMT_COUNTERVALUE_ITEM *tmp_num_thr =
NULL;
350 int _mem_size =
sizeof (PDH_FMT_COUNTERVALUE_ITEM) * num_counter_value;
351 tmp_pid = (PDH_FMT_COUNTERVALUE_ITEM *) realloc (cntvalue_pid, _mem_size);
358 cntvalue_pid = tmp_pid;
361 tmp_workset = (PDH_FMT_COUNTERVALUE_ITEM *) realloc (cntvalue_workset, _mem_size);
362 if (tmp_workset ==
NULL)
364 cntvalue_workset =
NULL;
368 cntvalue_workset = tmp_workset;
371 tmp_cpu = (PDH_FMT_COUNTERVALUE_ITEM *) realloc (cntvalue_pct_cpu, _mem_size);
374 cntvalue_pct_cpu =
NULL;
378 cntvalue_pct_cpu = tmp_cpu;
381 tmp_num_thr = (PDH_FMT_COUNTERVALUE_ITEM *) realloc (cntvalue_num_thr, _mem_size);
382 if (tmp_num_thr ==
NULL)
384 cntvalue_num_thr =
NULL;
388 cntvalue_num_thr = tmp_num_thr;
399 pdh_get_value (
int pid,
int *workset,
float *pct_cpu,
int *br_num_thr)
414 for (i = 0; i < pdh_num_proc; i++)
416 if (cntvalue_pid[i].FmtValue.longValue == pid)
418 *workset = (int) (cntvalue_workset[i].FmtValue.largeValue / 1024);
419 *pct_cpu = (float) (cntvalue_pct_cpu[i].FmtValue.doubleValue);
422 *br_num_thr = (int) (cntvalue_num_thr[i].FmtValue.largeValue);
435 PDH_STATUS pdh_status;
436 CHAR path_buffer[128];
438 h_module = LoadLibrary (
"pdh.dll");
439 if (h_module ==
NULL)
444 fp_PdhOpenQuery = (PDHOpenQuery) GetProcAddress (h_module,
"PdhOpenQueryA");
445 if (fp_PdhOpenQuery ==
NULL)
450 fp_PdhAddCounter = (PDHAddCounter) GetProcAddress (h_module,
"PdhAddCounterA");
451 if (fp_PdhAddCounter ==
NULL)
456 fp_PdhCollectQueryData = (PDHCollectQueryData) GetProcAddress (h_module,
"PdhCollectQueryData");
457 if (fp_PdhCollectQueryData ==
NULL)
462 fp_PdhGetFormattedCounterArray =
463 (PDHGetFormattedCounterArray) GetProcAddress (h_module,
"PdhGetFormattedCounterArrayA");
464 if (fp_PdhGetFormattedCounterArray ==
NULL)
469 fp_PdhCloseQuery = (PDHCloseQuery) GetProcAddress (h_module,
"PdhCloseQuery");
470 if (fp_PdhCloseQuery ==
NULL)
475 pdh_status = (*fp_PdhOpenQuery) (0, 0, &pdh_h_query);
476 if (pdh_status != ERROR_SUCCESS)
481 strcpy (path_buffer,
"\\Process(*)\\ID Process");
482 pdh_status = (*fp_PdhAddCounter) (pdh_h_query, path_buffer, 0, &counter_pid);
483 if (pdh_status != ERROR_SUCCESS)
488 strcpy (path_buffer,
"\\Process(*)\\Working Set");
489 pdh_status = (*fp_PdhAddCounter) (pdh_h_query, path_buffer, 0, &counter_workset);
490 if (pdh_status != ERROR_SUCCESS)
495 strcpy (path_buffer,
"\\Process(*)\\% Processor Time");
496 pdh_status = (*fp_PdhAddCounter) (pdh_h_query, path_buffer, 0, &counter_pct_cpu);
497 if (pdh_status != ERROR_SUCCESS)
502 strcpy (path_buffer,
"\\Process(*)\\Thread Count");
503 pdh_status = (*fp_PdhAddCounter) (pdh_h_query, path_buffer, 0, &counter_num_thr);
504 if (pdh_status != ERROR_SUCCESS)
509 num_counter_value = 128;
511 alloc_counter_value ();
512 if (IS_COUNTER_VALUE_PTR_NULL ())
516 memset (cntvalue_pid, 0,
sizeof (PDH_FMT_COUNTERVALUE_ITEM) * num_counter_value);
517 memset (cntvalue_workset, 0,
sizeof (PDH_FMT_COUNTERVALUE_ITEM) * num_counter_value);
518 memset (cntvalue_pct_cpu, 0,
sizeof (PDH_FMT_COUNTERVALUE_ITEM) * num_counter_value);
519 memset (cntvalue_num_thr, 0,
sizeof (PDH_FMT_COUNTERVALUE_ITEM) * num_counter_value);
527 unsigned long in_size;
528 PDH_STATUS pdh_status;
529 int i, retry_count = 10;
530 char success_flag =
FALSE;
532 if (IS_COUNTER_VALUE_PTR_NULL ())
534 alloc_counter_value ();
535 if (IS_COUNTER_VALUE_PTR_NULL ())
539 for (i = 0; i < retry_count; i++)
541 pdh_status = (*fp_PdhCollectQueryData) (pdh_h_query);
542 if (pdh_status != ERROR_SUCCESS)
546 in_size =
sizeof (PDH_FMT_COUNTERVALUE_ITEM) * num_counter_value;
548 pdh_status = (*fp_PdhGetFormattedCounterArray) (counter_pid, PDH_FMT_LONG, &in_size, &pdh_num_proc, cntvalue_pid);
549 if (pdh_status != ERROR_SUCCESS)
551 if (pdh_status == PDH_MORE_DATA)
553 num_counter_value *= 2;
554 alloc_counter_value ();
555 if (IS_COUNTER_VALUE_PTR_NULL ())
563 (*fp_PdhGetFormattedCounterArray) (counter_workset, PDH_FMT_LARGE, &in_size, &pdh_num_proc, cntvalue_workset);
564 if (pdh_status != ERROR_SUCCESS)
569 (*fp_PdhGetFormattedCounterArray) (counter_pct_cpu, PDH_FMT_DOUBLE, &in_size, &pdh_num_proc, cntvalue_pct_cpu);
570 if (pdh_status != ERROR_SUCCESS)
575 (*fp_PdhGetFormattedCounterArray) (counter_num_thr, PDH_FMT_LONG, &in_size, &pdh_num_proc, cntvalue_num_thr);
576 if (pdh_status != ERROR_SUCCESS)
585 if (success_flag ==
TRUE)
610 pp = popen (cmd,
"r");
616 while ((c = getc (pp)) != EOF)
626 if (kill (pid, 0) < 0)