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.76 by tdb, Mon Nov 1 18:30:17 2004 UTC vs.
Revision 1.77 by ats, Sat Nov 6 15:10:07 2004 UTC

# Line 76 | Line 76
76   #include <sys/param.h>
77   #include <sys/pstat.h>
78   #include <unistd.h>
79 + #define PROCESS_BATCH 30
80   #endif
81  
82   static void proc_state_init(sg_process_stats *s) {
# Line 94 | Line 95 | sg_process_stats *sg_get_process_stats(int *entries){
95          int proc_state_size = 0;
96          sg_process_stats *proc_state_ptr;
97   #ifdef HPUX
98 <        struct pst_status pstat_procinfo;
98 >        struct pst_status pstat_procinfo[PROCESS_BATCH];
99          long procidx = 0;
100 <        long long pagesize = 0;
100 >        long long pagesize;
101 >        int num, i;
102   #endif
103   #ifdef ALLBSD
104          int mib[4];
# Line 678 | Line 680 | sg_process_stats *sg_get_process_stats(int *entries){
680   #endif
681  
682   #ifdef HPUX
683 <        if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
683 >        if ((pagesize = sysconf(_SC_PAGESIZE)) == -1) {
684                  sg_set_error_with_errno(SG_ERROR_SYSCONF, "_SC_PAGESIZE");
685                  return NULL;
686          }
687  
688 <        for (procidx = 0; procidx < 65536; procidx++) {
689 <                if (pstat_getproc(&pstat_procinfo, sizeof(pstat_procinfo), 1, procidx) == -1) {
690 <                        break;
689 <                }
690 <                if (pstat_procinfo.pst_idx != procidx) {
691 <                        continue;
692 <                }
688 >        do {
689 >                num = pstat_getproc(pstat_procinfo, sizeof pstat_procinfo[0],
690 >                                    PROCESS_BATCH, procidx);
691  
692 <                if (VECTOR_RESIZE(proc_state, proc_state_size + 1) < 0) {
693 <                        return NULL;
696 <                }
697 <                proc_state_ptr = proc_state+proc_state_size;
692 >                for (i = 0; i < num; i++) {
693 >                        struct pst_status *pi = &pstat_procinfo[i];
694  
695 <                proc_state_ptr->pid = pstat_procinfo.pst_pid;
696 <                proc_state_ptr->parent = pstat_procinfo.pst_ppid;
697 <                proc_state_ptr->pgid = pstat_procinfo.pst_pgrp;
698 <                proc_state_ptr->uid = pstat_procinfo.pst_uid;
699 <                proc_state_ptr->euid = pstat_procinfo.pst_euid;
700 <                proc_state_ptr->gid = pstat_procinfo.pst_gid;
701 <                proc_state_ptr->egid = pstat_procinfo.pst_egid;
702 <                proc_state_ptr->proc_size = (pstat_procinfo.pst_dsize + pstat_procinfo.pst_tsize + pstat_procinfo.pst_ssize) * pagesize;
703 <                proc_state_ptr->proc_resident = pstat_procinfo.pst_rssize * pagesize;
704 <                proc_state_ptr->time_spent = pstat_procinfo.pst_time;
705 <                proc_state_ptr->cpu_percent = (pstat_procinfo.pst_pctcpu * 100.0) / 0x8000;
706 <                proc_state_ptr->nice = pstat_procinfo.pst_nice;
707 <
708 <                if (sg_update_string(&proc_state_ptr->process_name,
709 <                                     pstat_procinfo.pst_ucomm) < 0) {
710 <                        return NULL;
695 >                        if (VECTOR_RESIZE(proc_state, proc_state_size + 1) < 0) {
696 >                                return NULL;
697 >                        }
698 >                        proc_state_ptr = proc_state+proc_state_size;
699 >        
700 >                        proc_state_ptr->pid = pi->pst_pid;
701 >                        proc_state_ptr->parent = pi->pst_ppid;
702 >                        proc_state_ptr->pgid = pi->pst_pgrp;
703 >                        proc_state_ptr->uid = pi->pst_uid;
704 >                        proc_state_ptr->euid = pi->pst_euid;
705 >                        proc_state_ptr->gid = pi->pst_gid;
706 >                        proc_state_ptr->egid = pi->pst_egid;
707 >                        proc_state_ptr->proc_size = (pi->pst_dsize + pi->pst_tsize + pi->pst_ssize) * pagesize;
708 >                        proc_state_ptr->proc_resident = pi->pst_rssize * pagesize;
709 >                        proc_state_ptr->time_spent = pi->pst_time;
710 >                        proc_state_ptr->cpu_percent = (pi->pst_pctcpu * 100.0) / 0x8000;
711 >                        proc_state_ptr->nice = pi->pst_nice;
712 >        
713 >                        if (sg_update_string(&proc_state_ptr->process_name,
714 >                                             pi->pst_ucomm) < 0) {
715 >                                return NULL;
716 >                        }
717 >                        if (sg_update_string(&proc_state_ptr->proctitle,
718 >                                             pi->pst_cmd) < 0) {
719 >                                return NULL;
720 >                        }
721 >        
722 >                        switch (pi->pst_stat) {
723 >                        case PS_SLEEP:
724 >                                proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING;
725 >                                break;
726 >                        case PS_RUN:
727 >                                proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
728 >                                break;
729 >                        case PS_STOP:
730 >                                proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
731 >                                break;
732 >                        case PS_ZOMBIE:
733 >                                proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE;
734 >                                break;
735 >                        case PS_IDLE:
736 >                        case PS_OTHER:
737 >                                proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
738 >                                break;
739 >                        }
740 >        
741 >                        proc_state_size++;
742                  }
743 <                if (sg_update_string(&proc_state_ptr->proctitle,
744 <                                     pstat_procinfo.pst_cmd) < 0) {
718 <                        return NULL;
719 <                }
720 <
721 <                switch (pstat_procinfo.pst_stat) {
722 <                case PS_SLEEP:
723 <                        proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING;
724 <                        break;
725 <                case PS_RUN:
726 <                        proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
727 <                        break;
728 <                case PS_STOP:
729 <                        proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
730 <                        break;
731 <                case PS_ZOMBIE:
732 <                        proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE;
733 <                        break;
734 <                case PS_IDLE:
735 <                case PS_OTHER:
736 <                        proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
737 <                        break;
738 <                }
739 <
740 <                proc_state_size++;
741 <        }
742 <
743 >                procidx = pstat_procinfo[n - 1].pst_idx + 1;
744 >        } while (num > 0);
745   #endif
746  
747   #ifdef CYGWIN

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines