ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c
Revision: 1.12
Committed: Sun Oct 19 00:25:30 2003 UTC (20 years, 7 months ago) by ats
Content type: text/plain
Branch: MAIN
Changes since 1.11: +2 -5 lines
Log Message:
Add a helper function for opening the kvm handle. This removes a little
bit of duplicated code, and means that we don't open and close kvm
(which can potentially be quite expensive) each time we use it. This
will also be useful for NetBSD.

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     #ifdef SOLARIS
35     #include <procfs.h>
36     #include <limits.h>
37 pajs 1.5 #define PROC_LOCATION "/proc"
38     #define MAX_FILE_LENGTH PATH_MAX
39     #endif
40     #ifdef LINUX
41     #include "tools.h"
42     #include <linux/limits.h>
43 pajs 1.1 #define PROC_LOCATION "/proc"
44     #define MAX_FILE_LENGTH PATH_MAX
45     #endif
46 pajs 1.6 #ifdef FREEBSD
47     #include <kvm.h>
48     #include <sys/param.h>
49     #include <sys/sysctl.h>
50     #include <sys/user.h>
51     #endif
52 pajs 1.1
53     process_stat_t *get_process_stats(){
54    
55     static process_stat_t process_stat;
56    
57 pajs 1.6 #if defined(SOLARIS) || defined(LINUX)
58 pajs 1.1 DIR *proc_dir;
59     struct dirent *dir_entry;
60     char filename[MAX_FILE_LENGTH];
61     FILE *f;
62 pajs 1.6 #endif
63 pajs 1.5 #ifdef LINUX
64     char *line_ptr;
65     #endif
66     #ifdef SOLARIS
67     psinfo_t process_info;
68     #endif
69 pajs 1.6 #ifdef FREEBSD
70     struct kinfo_proc *kp_stats;
71 ats 1.12 kvm_t *kvmd;
72 pajs 1.6 int procs;
73     #endif
74 pajs 1.1
75     process_stat.sleeping=0;
76     process_stat.running=0;
77     process_stat.zombie=0;
78     process_stat.stopped=0;
79 pajs 1.5 process_stat.total=0;
80 pajs 1.1
81 pajs 1.7 #if defined(SOLARIS) || defined(LINUX)
82 pajs 1.1 if((proc_dir=opendir(PROC_LOCATION))==NULL){
83     return NULL;
84     }
85    
86     while((dir_entry=readdir(proc_dir))!=NULL){
87     if(atoi(dir_entry->d_name) == 0) continue;
88 pajs 1.5
89     #ifdef SOLARIS
90 pajs 1.1 snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/psinfo", dir_entry->d_name);
91 pajs 1.5 #endif
92     #ifdef LINUX
93     snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/status", dir_entry->d_name);
94     #endif
95 pajs 1.1
96     if((f=fopen(filename, "r"))==NULL){
97     /* Open failed.. Process since vanished, or the path was too long.
98     * Ah well, move onwards to the next one */
99     continue;
100     }
101    
102 pajs 1.5 #ifdef SOLARIS
103 pajs 1.1 fread(&process_info, sizeof(psinfo_t), 1, f);
104     if(process_info.pr_lwp.pr_state==1) process_stat.sleeping++;
105     if(process_info.pr_lwp.pr_state==2) process_stat.running++;
106     if(process_info.pr_lwp.pr_state==3) process_stat.zombie++;
107     if(process_info.pr_lwp.pr_state==4) process_stat.stopped++;
108     if(process_info.pr_lwp.pr_state==6) process_stat.running++;
109 pajs 1.5 #endif
110     #ifdef LINUX
111     if((line_ptr=f_read_line(f, "State:"))==NULL){
112     fclose(f);
113     continue;
114     }
115     if((line_ptr=strchr(line_ptr, '\t'))==NULL){
116     fclose(f);
117     continue;
118     }
119     line_ptr++;
120     if(line_ptr=='\0'){
121     fclose(f);
122     continue;
123     }
124    
125     if(*line_ptr=='S') process_stat.sleeping++;
126     if(*line_ptr=='R') process_stat.running++;
127     if(*line_ptr=='Z') process_stat.zombie++;
128     if(*line_ptr=='T') process_stat.stopped++;
129     if(*line_ptr=='D') process_stat.stopped++;
130     #endif
131    
132     fclose(f);
133 pajs 1.1 }
134     closedir(proc_dir);
135 pajs 1.6 #endif
136     #ifdef FREEBSD
137 ats 1.12 if((kvmd = get_kvm()) == NULL){
138 pajs 1.6 return NULL;
139     }
140    
141     kp_stats=kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &procs);
142 pajs 1.1
143 pajs 1.6 while(procs--){
144 pajs 1.9 #ifdef FREEBSD5
145     if (kp_stats[procs].ki_stat == SSLEEP) process_stat.sleeping++;
146 pajs 1.11 if (kp_stats[procs].ki_stat == SWAIT) process_stat.sleeping++;
147     if (kp_stats[procs].ki_stat == SLOCK) process_stat.sleeping++;
148 pajs 1.9 if (kp_stats[procs].ki_stat == SRUN) process_stat.running++;
149     if (kp_stats[procs].ki_stat == SIDL) process_stat.running++;
150     if (kp_stats[procs].ki_stat == SZOMB) process_stat.zombie++;
151     if (kp_stats[procs].ki_stat == SSTOP) process_stat.stopped++;
152 pajs 1.11
153 pajs 1.9 #else
154 pajs 1.6 if (kp_stats[procs].kp_proc.p_stat == SSLEEP) process_stat.sleeping++;
155     if (kp_stats[procs].kp_proc.p_stat == SRUN) process_stat.running++;
156     if (kp_stats[procs].kp_proc.p_stat == SIDL) process_stat.running++;
157     if (kp_stats[procs].kp_proc.p_stat == SZOMB) process_stat.zombie++;
158     if (kp_stats[procs].kp_proc.p_stat == SSTOP) process_stat.stopped++;
159 pajs 1.9 #endif
160 pajs 1.6 }
161     #endif
162 pajs 1.4
163     process_stat.total=process_stat.sleeping+process_stat.running+process_stat.zombie+process_stat.stopped;
164 pajs 1.10
165 pajs 1.1 return &process_stat;
166     }