ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c
(Generate patch)

Comparing projects/libstatgrab/src/libstatgrab/process_stats.c (file contents):
Revision 1.54 by ats, Mon Apr 5 19:55:27 2004 UTC vs.
Revision 1.59 by tdb, Tue Apr 6 21:08:03 2004 UTC

# Line 1 | Line 1
1   /*
2 < * i-scream central monitoring system
2 > * i-scream libstatgrab
3   * http://www.i-scream.org
4   * Copyright (C) 2000-2004 i-scream
5   *
# Line 65 | Line 65
65   #include <limits.h>
66   #if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD)
67   #include <kvm.h>
68 #include <tools.h>
68   #endif
69   #include <unistd.h>
70 + #ifdef NETBSD2
71 + #include <sys/lwp.h>
72   #endif
73 + #endif
74  
75   static void proc_state_init(sg_process_stats *s) {
76          s->process_name = NULL;
# Line 99 | Line 101 | sg_process_stats *sg_get_process_stats(int *entries){
101          long buflen;
102          char *p;
103   #endif
104 + #ifdef NETBSD2
105 +        int lwps;
106 +        struct kinfo_lwp *kl_stats;
107   #endif
108 + #endif
109   #if defined(SOLARIS) || defined(LINUX)
110          DIR *proc_dir;
111          struct dirent *dir_entry;
# Line 114 | Line 120 | sg_process_stats *sg_get_process_stats(int *entries){
120          char ps_name[4096];
121          char *ptr;
122          VECTOR_DECLARE_STATIC(psargs, char, 128, NULL, NULL);
123 <        unsigned long stime, utime;
123 >        unsigned long stime, utime, starttime;
124          int x;
125          int fn;
126          int len;
127          int rc;
128 +        time_t uptime;
129   #endif
130  
131 + #ifdef LINUX
132 +        if ((f=fopen("/proc/uptime", "r")) == NULL) {
133 +                return NULL;
134 +        }
135 +        if((fscanf(f,"%lu %*d",&uptime)) != 1){
136 +                return NULL;
137 +        }
138 +        fclose(f);
139 + #endif
140 +
141          if((proc_dir=opendir(PROC_LOCATION))==NULL){
142                  return NULL;
143          }
# Line 170 | Line 187 | sg_process_stats *sg_get_process_stats(int *entries){
187                  if(process_info.pr_lwp.pr_state==6) proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
188   #endif
189   #ifdef LINUX
190 <                x = fscanf(f, "%d %4096s %c %d %d %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu %*d %*d %*d %d %*d %*d %*u %llu %llu %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %*d\n", &(proc_state_ptr->pid), ps_name, &s, &(proc_state_ptr->parent), &(proc_state_ptr->pgid), &utime, &stime, &(proc_state_ptr->nice), &(proc_state_ptr->proc_size), &(proc_state_ptr->proc_resident));
191 <                proc_state_ptr->proc_resident = proc_state_ptr->proc_resident * getpagesize();
190 >                x = fscanf(f, "%d %4096s %c %d %d %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu %*d %*d %*d %d %*d %*d %lu %llu %llu %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %*d\n", &(proc_state_ptr->pid), ps_name, &s, &(proc_state_ptr->parent), &(proc_state_ptr->pgid), &utime, &stime, &(proc_state_ptr->nice), &starttime, &(proc_state_ptr->proc_size), &(proc_state_ptr->proc_resident));
191 >                /* +3 becuase man page says "Resident  Set Size: number of pages the process has in real memory, minus 3 for administrative purposes." */
192 >                proc_state_ptr->proc_resident = (proc_state_ptr->proc_resident + 3) * getpagesize();
193                  if(s == 'S') proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING;
194                  if(s == 'R') proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
195                  if(s == 'Z') proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE;
# Line 187 | Line 205 | sg_process_stats *sg_get_process_stats(int *entries){
205                          return NULL;
206                  }
207  
208 <                /* Need to do cpu */
209 <                
208 >                /* cpu */
209 >                proc_state_ptr->cpu_percent = (100.0 * (utime + stime)) / ((uptime * 100.0) - starttime);
210 >                printf("%s  ut: %lu st: %lu up: %lu start: %lu\n", proc_state_ptr->process_name, utime, stime, uptime , starttime);
211  
212                  fclose(f);
213  
# Line 278 | Line 297 | sg_process_stats *sg_get_process_stats(int *entries){
297          for (i = 0; i < procs; i++) {
298                  const char *name;
299  
300 + #ifdef FREEBSD5
301                  if (kp_stats[i].ki_stat == 0) {
302 + #else
303 +                if (kp_stats[i].kp_proc.p_stat == 0) {
304 + #endif
305                          /* FreeBSD 5 deliberately overallocates the array that
306                           * the sysctl returns, so we'll get a few junk
307                           * processes on the end that we have to ignore. (Search
# Line 311 | Line 334 | sg_process_stats *sg_get_process_stats(int *entries){
334                          return NULL;
335                  }
336   #else
337 +                /* FIXME - this value can be too large on some of
338 +                   the BSD's, which causes sysctl not to return
339 +                   anything. Maybe we need something smaller? */
340                  mib[1] = KERN_ARGMAX;
341  
342                  if(sysctl(mib, 2, &buflen, &size, NULL, 0) < 0) {
# Line 453 | Line 479 | sg_process_stats *sg_get_process_stats(int *entries){
479                  proc_state_ptr->nice = kp_stats[i].kp_proc.p_nice;
480   #endif
481  
482 + #ifdef NETBSD2
483 +                {
484 +                        size_t size;
485 +                        int mib[5];
486 +
487 +                        mib[0] = CTL_KERN;
488 +                        mib[1] = KERN_LWP;
489 +                        mib[2] = kp_stats[i].kp_proc.p_pid;
490 +                        mib[3] = sizeof(struct kinfo_lwp);
491 +                        mib[4] = 0;
492 +
493 +                        if(sysctl(mib, 5, NULL, &size, NULL, 0) < 0) {
494 +                                return NULL;
495 +                        }
496 +
497 +                        lwps = size / sizeof(struct kinfo_lwp);
498 +                        mib[4] = lwps;
499 +
500 +                        kl_stats = malloc(size);
501 +                        if(kl_stats == NULL) {
502 +                                return NULL;
503 +                        }
504 +
505 +                        if(sysctl(mib, 5, kl_stats, &size, NULL, 0) < 0) {
506 +                                return NULL;
507 +                        }
508 +                }
509 +
510 +                switch(kp_stats[i].kp_proc.p_stat) {
511 +                case SIDL:
512 +                        proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
513 +                        break;
514 +                case SACTIVE:
515 +                        {
516 +                                int i;
517 +
518 +                                for(i = 0; i < lwps; i++) {
519 +                                        switch(kl_stats[i].l_stat) {
520 +                                        case LSONPROC:
521 +                                        case LSRUN:
522 +                                                proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
523 +                                                goto end;
524 +                                        case LSSLEEP:
525 +                                                proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING;
526 +                                                goto end;
527 +                                        case LSSTOP:
528 +                                        case LSSUSPENDED:
529 +                                                proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
530 +                                                goto end;
531 +                                        }
532 +                                        proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
533 +                                }
534 +                                end: ;
535 +                        }
536 +                        break;
537 +                case SSTOP:
538 +                        proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
539 +                        break;
540 +                case SZOMB:
541 +                        proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE;
542 +                        break;
543 +                default:
544 +                        proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
545 +                        break;
546 +                }
547 + #else
548   #ifdef FREEBSD5
549                  switch (kp_stats[i].ki_stat) {
550   #else
# Line 487 | Line 579 | sg_process_stats *sg_get_process_stats(int *entries){
579                          proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
580                          break;
581                  }
582 + #endif
583                  proc_state_size++;
584          }
585  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines