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.25 by pajs, Tue Mar 30 13:41:31 2004 UTC vs.
Revision 1.26 by tdb, Tue Mar 30 22:10:04 2004 UTC

# Line 63 | Line 63 | int get_proc_snapshot(proc_state_t **ps){
63          proc_state_t *proc_state = NULL;
64          proc_state_t *proc_state_ptr;
65          int proc_state_size = 0;
66 + #ifdef ALLBSD
67 +        int mib[3];
68 +        size_t size;
69 +        struct kinfo_proc *kp_stats;
70 +        int procs, i;
71 + #endif
72   #if defined(SOLARIS) || defined(LINUX)
73          DIR *proc_dir;
74          struct dirent *dir_entry;
# Line 186 | Line 192 | int get_proc_snapshot(proc_state_t **ps){
192   #endif
193  
194                  proc_state_size++;
189 #endif
195  
191
196                  fclose(f);
197          }
198          closedir(proc_dir);
199 <        *ps = proc_state;
199 > #endif
200  
201 + #ifdef ALLBSD
202 +        mib[0] = CTL_KERN;
203 +        mib[1] = KERN_PROC;
204 +        mib[2] = KERN_PROC_ALL;
205 +
206 +        if (sysctl(mib, 3, NULL, &size, NULL, 0) < 0) {
207 +                return NULL;
208 +        }
209 +
210 +        procs = size / sizeof(struct kinfo_proc);
211 +
212 +        kp_stats = malloc(size);
213 +        if (kp_stats == NULL) {
214 +                return NULL;
215 +        }
216 +
217 +        if (sysctl(mib, 3, kp_stats, &size, NULL, 0) < 0) {
218 +                free(kp_stats);
219 +                return NULL;
220 +        }
221 +
222 +        for (i = 0; i < procs; i++) {
223 +                proc_state = realloc(proc_state, (1+proc_state_size)*sizeof(proc_state_t));
224 +                proc_state_ptr = proc_state+proc_state_size;
225 +                
226 +                proc_state_ptr->process_name = strdup(kp_stats[i].ki_comm);
227 +                /* Seems we don't have access to that bit of memory */
228 +                /*proc_state_ptr->proctitle = strdup(kp_stats[i].ki_args->ar_args);*/
229 +
230 +                proc_state_ptr->pid = kp_stats[i].ki_pid;
231 +                proc_state_ptr->parent = kp_stats[i].ki_ppid;
232 +                proc_state_ptr->pgid = kp_stats[i].ki_pgid;
233 +
234 +                proc_state_ptr->uid = kp_stats[i].ki_ruid;
235 +                proc_state_ptr->euid = kp_stats[i].ki_uid;
236 +                proc_state_ptr->gid = kp_stats[i].ki_rgid;
237 +                proc_state_ptr->egid = kp_stats[i].ki_svgid;
238 +
239 +                proc_state_ptr->proc_size = kp_stats[i].ki_size;
240 +                /* This is in pages */
241 +                proc_state_ptr->proc_resident = kp_stats[i].ki_rssize * getpagesize();
242 +                /* This seems to be in microseconds */
243 +                proc_state_ptr->time_spent = kp_stats[i].ki_runtime / 1000000;
244 +                proc_state_ptr->cpu_percent = kp_stats[i].ki_pctcpu;
245 +                proc_state_ptr->nice = kp_stats[i].ki_nice;
246 +
247 +                switch (kp_stats[i].ki_stat) {
248 +                case SIDL:
249 +                case SRUN:
250 + #ifdef SONPROC
251 +                case SONPROC: /* NetBSD */
252 + #endif
253 +                        proc_state_ptr->state = RUNNING;
254 +                        break;
255 +                case SSLEEP:
256 + #ifdef SWAIT
257 +                case SWAIT: /* FreeBSD 5 */
258 + #endif
259 + #ifdef SLOCK
260 +                case SLOCK: /* FreeBSD 5 */
261 + #endif
262 +                        proc_state_ptr->state = SLEEPING;
263 +                        break;
264 +                case SSTOP:
265 +                        proc_state_ptr->state = STOPPED;
266 +                        break;
267 +                case SZOMB:
268 + #ifdef SDEAD
269 +                case SDEAD: /* OpenBSD & NetBSD */
270 + #endif
271 +                        proc_state_ptr->state = ZOMBIE;
272 +                        break;
273 +                }
274 +                proc_state_size++;
275 +        }
276 +
277 +        free(kp_stats);
278 + #endif
279 +
280 +        *ps = proc_state;
281          return proc_state_size;
282   }
199

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines