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.78 by ats, Sat Nov 6 15:31:26 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) {
688 >        while (1) {
689 >                num = pstat_getproc(pstat_procinfo, sizeof pstat_procinfo[0],
690 >                                    PROCESS_BATCH, procidx);
691 >                if (num == -1) {
692 >                        sg_set_error_with_errno(SG_ERROR_PSTAT,
693 >                                                "pstat_getproc");
694 >                        return NULL;
695 >                } else if (num == 0) {
696                          break;
697                  }
690                if (pstat_procinfo.pst_idx != procidx) {
691                        continue;
692                }
698  
699 <                if (VECTOR_RESIZE(proc_state, proc_state_size + 1) < 0) {
700 <                        return NULL;
696 <                }
697 <                proc_state_ptr = proc_state+proc_state_size;
699 >                for (i = 0; i < num; i++) {
700 >                        struct pst_status *pi = &pstat_procinfo[i];
701  
702 <                proc_state_ptr->pid = pstat_procinfo.pst_pid;
703 <                proc_state_ptr->parent = pstat_procinfo.pst_ppid;
704 <                proc_state_ptr->pgid = pstat_procinfo.pst_pgrp;
705 <                proc_state_ptr->uid = pstat_procinfo.pst_uid;
706 <                proc_state_ptr->euid = pstat_procinfo.pst_euid;
707 <                proc_state_ptr->gid = pstat_procinfo.pst_gid;
708 <                proc_state_ptr->egid = pstat_procinfo.pst_egid;
709 <                proc_state_ptr->proc_size = (pstat_procinfo.pst_dsize + pstat_procinfo.pst_tsize + pstat_procinfo.pst_ssize) * pagesize;
710 <                proc_state_ptr->proc_resident = pstat_procinfo.pst_rssize * pagesize;
711 <                proc_state_ptr->time_spent = pstat_procinfo.pst_time;
712 <                proc_state_ptr->cpu_percent = (pstat_procinfo.pst_pctcpu * 100.0) / 0x8000;
713 <                proc_state_ptr->nice = pstat_procinfo.pst_nice;
714 <
715 <                if (sg_update_string(&proc_state_ptr->process_name,
716 <                                     pstat_procinfo.pst_ucomm) < 0) {
717 <                        return NULL;
702 >                        if (VECTOR_RESIZE(proc_state, proc_state_size + 1) < 0) {
703 >                                return NULL;
704 >                        }
705 >                        proc_state_ptr = proc_state+proc_state_size;
706 >        
707 >                        proc_state_ptr->pid = pi->pst_pid;
708 >                        proc_state_ptr->parent = pi->pst_ppid;
709 >                        proc_state_ptr->pgid = pi->pst_pgrp;
710 >                        proc_state_ptr->uid = pi->pst_uid;
711 >                        proc_state_ptr->euid = pi->pst_euid;
712 >                        proc_state_ptr->gid = pi->pst_gid;
713 >                        proc_state_ptr->egid = pi->pst_egid;
714 >                        proc_state_ptr->proc_size = (pi->pst_dsize + pi->pst_tsize + pi->pst_ssize) * pagesize;
715 >                        proc_state_ptr->proc_resident = pi->pst_rssize * pagesize;
716 >                        proc_state_ptr->time_spent = pi->pst_time;
717 >                        proc_state_ptr->cpu_percent = (pi->pst_pctcpu * 100.0) / 0x8000;
718 >                        proc_state_ptr->nice = pi->pst_nice;
719 >        
720 >                        if (sg_update_string(&proc_state_ptr->process_name,
721 >                                             pi->pst_ucomm) < 0) {
722 >                                return NULL;
723 >                        }
724 >                        if (sg_update_string(&proc_state_ptr->proctitle,
725 >                                             pi->pst_cmd) < 0) {
726 >                                return NULL;
727 >                        }
728 >        
729 >                        switch (pi->pst_stat) {
730 >                        case PS_SLEEP:
731 >                                proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING;
732 >                                break;
733 >                        case PS_RUN:
734 >                                proc_state_ptr->state = SG_PROCESS_STATE_RUNNING;
735 >                                break;
736 >                        case PS_STOP:
737 >                                proc_state_ptr->state = SG_PROCESS_STATE_STOPPED;
738 >                                break;
739 >                        case PS_ZOMBIE:
740 >                                proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE;
741 >                                break;
742 >                        case PS_IDLE:
743 >                        case PS_OTHER:
744 >                                proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN;
745 >                                break;
746 >                        }
747 >        
748 >                        proc_state_size++;
749                  }
750 <                if (sg_update_string(&proc_state_ptr->proctitle,
717 <                                     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++;
750 >                procidx = pstat_procinfo[num - 1].pst_idx + 1;
751          }
742
752   #endif
753  
754   #ifdef CYGWIN

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines