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.55 by tdb, Tue Apr 6 13:40:41 2004 UTC

# Line 68 | Line 68
68   #include <tools.h>
69   #endif
70   #include <unistd.h>
71 + #ifdef NETBSD2
72 + #include <sys/lwp.h>
73   #endif
74 + #endif
75  
76   static void proc_state_init(sg_process_stats *s) {
77          s->process_name = NULL;
# Line 99 | Line 102 | sg_process_stats *sg_get_process_stats(int *entries){
102          long buflen;
103          char *p;
104   #endif
105 + #ifdef NETBSD2
106 +        int lwps;
107 +        struct kinfo_lwp *kl_stats;
108   #endif
109 + #endif
110   #if defined(SOLARIS) || defined(LINUX)
111          DIR *proc_dir;
112          struct dirent *dir_entry;
# Line 278 | Line 285 | sg_process_stats *sg_get_process_stats(int *entries){
285          for (i = 0; i < procs; i++) {
286                  const char *name;
287  
288 + #ifdef FREEBSD5
289                  if (kp_stats[i].ki_stat == 0) {
290 + #else
291 +                if (kp_stats[i].kp_proc.p_stat == 0) {
292 + #endif
293                          /* FreeBSD 5 deliberately overallocates the array that
294                           * the sysctl returns, so we'll get a few junk
295                           * processes on the end that we have to ignore. (Search
# Line 453 | Line 464 | sg_process_stats *sg_get_process_stats(int *entries){
464                  proc_state_ptr->nice = kp_stats[i].kp_proc.p_nice;
465   #endif
466  
467 + #ifdef NETBSD2
468 +                {
469 +                        size_t size;
470 +                        int mib[5];
471 +
472 +                        mib[0] = CTL_KERN;
473 +                        mib[1] = KERN_LWP;
474 +                        mib[2] = kp_stats[i].kp_proc.p_pid;
475 +                        mib[3] = sizeof(struct kinfo_lwp);
476 +                        mib[4] = 0;
477 +
478 +                        if(sysctl(mib, 5, NULL, &size, NULL, 0) < 0) {
479 +                                return NULL;
480 +                        }
481 +
482 +                        lwps = size / sizeof(struct kinfo_lwp);
483 +                        mib[4] = lwps;
484 +
485 +                        kl_stats = malloc(size);
486 +                        if(kl_stats == NULL) {
487 +                                return NULL;
488 +                        }
489 +
490 +                        if(sysctl(mib, 5, kl_stats, &size, NULL, 0) < 0) {
491 +                                return NULL;
492 +                        }
493 +                }
494 +
495 +                switch(kp_stats[i].kp_proc.p_stat) {
496 +                case SIDL:
497 +                        proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
498 +                        break;
499 +                case SACTIVE:
500 +                        {
501 +                                int i;
502 +
503 +                                for(i = 0; i < lwps; i++) {
504 +                                        switch(kl_stats[i].l_stat) {
505 +                                        case LSONPROC:
506 +                                        case LSRUN:
507 +                                                proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
508 +                                                goto end;
509 +                                        case LSSLEEP:
510 +                                                proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING;
511 +                                                goto end;
512 +                                        case LSSTOP:
513 +                                        case LSSUSPENDED:
514 +                                                proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
515 +                                                goto end;
516 +                                        }
517 +                                        proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
518 +                                }
519 +                                end: ;
520 +                        }
521 +                        break;
522 +                case SSTOP:
523 +                        proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
524 +                        break;
525 +                case SZOMB:
526 +                        proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE;
527 +                        break;
528 +                default:
529 +                        proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
530 +                        break;
531 +                }
532 + #else
533   #ifdef FREEBSD5
534                  switch (kp_stats[i].ki_stat) {
535   #else
# Line 487 | Line 564 | sg_process_stats *sg_get_process_stats(int *entries){
564                          proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
565                          break;
566                  }
567 + #endif
568                  proc_state_size++;
569          }
570  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines