ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c
Revision: 1.13
Committed: Sun Oct 19 02:03:02 2003 UTC (20 years, 7 months ago) by ats
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_7
Changes since 1.12: +6 -4 lines
Log Message:
Initial support for NetBSD. This adds NetBSD support for everything
except diskio stats (since they're even more disturbingly complex to get
at on NetBSD than the three OSs we already support). Tested against
NetBSD 1.6 on i386.

File Contents

# User Rev Content
1 pajs 1.1 /*
2     * i-scream central monitoring system
3 tdb 1.8 * http://www.i-scream.org
4     * Copyright (C) 2000-2003 i-scream
5 pajs 1.1 *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19     */
20    
21     #ifdef HAVE_CONFIG_H
22     #include "config.h"
23     #endif
24    
25 pajs 1.6 #include "statgrab.h"
26     #if defined(SOLARIS) || defined(LINUX)
27 pajs 1.1 #include <stdio.h>
28     #include <stdlib.h>
29 pajs 1.5 #include <sys/types.h>
30     #include <dirent.h>
31     #include <string.h>
32 pajs 1.6 #endif
33 pajs 1.1
34 ats 1.13 #include "tools.h"
35 pajs 1.1 #ifdef SOLARIS
36     #include <procfs.h>
37     #include <limits.h>
38 pajs 1.5 #define PROC_LOCATION "/proc"
39     #define MAX_FILE_LENGTH PATH_MAX
40     #endif
41     #ifdef LINUX
42     #include <linux/limits.h>
43 pajs 1.1 #define PROC_LOCATION "/proc"
44     #define MAX_FILE_LENGTH PATH_MAX
45     #endif
46 ats 1.13 #ifdef ALLBSD
47 pajs 1.6 #include <kvm.h>
48     #include <sys/param.h>
49     #include <sys/sysctl.h>
50 ats 1.13 #endif
51     #ifdef FREEBSD
52 pajs 1.6 #include <sys/user.h>
53     #endif
54 pajs 1.1
55     process_stat_t *get_process_stats(){
56    
57     static process_stat_t process_stat;
58    
59 pajs 1.6 #if defined(SOLARIS) || defined(LINUX)
60 pajs 1.1 DIR *proc_dir;
61     struct dirent *dir_entry;
62     char filename[MAX_FILE_LENGTH];
63     FILE *f;
64 pajs 1.6 #endif
65 pajs 1.5 #ifdef LINUX
66     char *line_ptr;
67     #endif
68     #ifdef SOLARIS
69     psinfo_t process_info;
70     #endif
71 ats 1.13 #ifdef ALLBSD
72 pajs 1.6 struct kinfo_proc *kp_stats;
73 ats 1.12 kvm_t *kvmd;
74 pajs 1.6 int procs;
75     #endif
76 pajs 1.1
77     process_stat.sleeping=0;
78     process_stat.running=0;
79     process_stat.zombie=0;
80     process_stat.stopped=0;
81 pajs 1.5 process_stat.total=0;
82 pajs 1.1
83 pajs 1.7 #if defined(SOLARIS) || defined(LINUX)
84 pajs 1.1 if((proc_dir=opendir(PROC_LOCATION))==NULL){
85     return NULL;
86     }
87    
88     while((dir_entry=readdir(proc_dir))!=NULL){
89     if(atoi(dir_entry->d_name) == 0) continue;
90 pajs 1.5
91     #ifdef SOLARIS
92 pajs 1.1 snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/psinfo", dir_entry->d_name);
93 pajs 1.5 #endif
94     #ifdef LINUX
95     snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/status", dir_entry->d_name);
96     #endif
97 pajs 1.1
98     if((f=fopen(filename, "r"))==NULL){
99     /* Open failed.. Process since vanished, or the path was too long.
100     * Ah well, move onwards to the next one */
101     continue;
102     }
103    
104 pajs 1.5 #ifdef SOLARIS
105 pajs 1.1 fread(&process_info, sizeof(psinfo_t), 1, f);
106     if(process_info.pr_lwp.pr_state==1) process_stat.sleeping++;
107     if(process_info.pr_lwp.pr_state==2) process_stat.running++;
108     if(process_info.pr_lwp.pr_state==3) process_stat.zombie++;
109     if(process_info.pr_lwp.pr_state==4) process_stat.stopped++;
110     if(process_info.pr_lwp.pr_state==6) process_stat.running++;
111 pajs 1.5 #endif
112     #ifdef LINUX
113     if((line_ptr=f_read_line(f, "State:"))==NULL){
114     fclose(f);
115     continue;
116     }
117     if((line_ptr=strchr(line_ptr, '\t'))==NULL){
118     fclose(f);
119     continue;
120     }
121     line_ptr++;
122     if(line_ptr=='\0'){
123     fclose(f);
124     continue;
125     }
126    
127     if(*line_ptr=='S') process_stat.sleeping++;
128     if(*line_ptr=='R') process_stat.running++;
129     if(*line_ptr=='Z') process_stat.zombie++;
130     if(*line_ptr=='T') process_stat.stopped++;
131     if(*line_ptr=='D') process_stat.stopped++;
132     #endif
133    
134     fclose(f);
135 pajs 1.1 }
136     closedir(proc_dir);
137 pajs 1.6 #endif
138 ats 1.13 #ifdef ALLBSD
139 ats 1.12 if((kvmd = get_kvm()) == NULL){
140 pajs 1.6 return NULL;
141     }
142    
143     kp_stats=kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &procs);
144 pajs 1.1
145 pajs 1.6 while(procs--){
146 pajs 1.9 #ifdef FREEBSD5
147     if (kp_stats[procs].ki_stat == SSLEEP) process_stat.sleeping++;
148 pajs 1.11 if (kp_stats[procs].ki_stat == SWAIT) process_stat.sleeping++;
149     if (kp_stats[procs].ki_stat == SLOCK) process_stat.sleeping++;
150 pajs 1.9 if (kp_stats[procs].ki_stat == SRUN) process_stat.running++;
151     if (kp_stats[procs].ki_stat == SIDL) process_stat.running++;
152     if (kp_stats[procs].ki_stat == SZOMB) process_stat.zombie++;
153     if (kp_stats[procs].ki_stat == SSTOP) process_stat.stopped++;
154 pajs 1.11
155 pajs 1.9 #else
156 pajs 1.6 if (kp_stats[procs].kp_proc.p_stat == SSLEEP) process_stat.sleeping++;
157     if (kp_stats[procs].kp_proc.p_stat == SRUN) process_stat.running++;
158     if (kp_stats[procs].kp_proc.p_stat == SIDL) process_stat.running++;
159     if (kp_stats[procs].kp_proc.p_stat == SZOMB) process_stat.zombie++;
160     if (kp_stats[procs].kp_proc.p_stat == SSTOP) process_stat.stopped++;
161 pajs 1.9 #endif
162 pajs 1.6 }
163     #endif
164 pajs 1.4
165     process_stat.total=process_stat.sleeping+process_stat.running+process_stat.zombie+process_stat.stopped;
166 pajs 1.10
167 pajs 1.1 return &process_stat;
168     }