23b84554d8
- Fixes in procmem calculation. - Clear libgtop_server2 responce structure to avoid use of uninitialized memory. - Retry read/write after EINTR wich in fact is not an error. - A number of glibtop_errors downgraded to glibtop_warns to avoid unxepected libgtop_server2 termination.
153 lines
4 KiB
C
153 lines
4 KiB
C
--- sysdeps/freebsd/proctime.c.orig Thu Feb 15 06:36:42 2001
|
|
+++ sysdeps/freebsd/proctime.c Tue Sep 9 11:17:56 2003
|
|
@@ -57,6 +57,7 @@
|
|
* system, and interrupt time usage.
|
|
*/
|
|
|
|
+#ifndef __FreeBSD__
|
|
static void
|
|
calcru(p, up, sp, ip)
|
|
struct proc *p;
|
|
@@ -66,9 +67,6 @@
|
|
{
|
|
quad_t totusec;
|
|
u_quad_t u, st, ut, it, tot;
|
|
-#if (__FreeBSD_version < 300003)
|
|
- long sec, usec;
|
|
-#endif
|
|
struct timeval tv;
|
|
|
|
st = p->p_sticks;
|
|
@@ -81,19 +79,10 @@
|
|
tot = 1;
|
|
}
|
|
|
|
-#if (defined __FreeBSD__) && (__FreeBSD_version >= 300003)
|
|
-
|
|
- /* This was changed from a `struct timeval' into a `u_int64_t'
|
|
- * on FreeBSD 3.0 and renamed p_rtime -> p_runtime.
|
|
- */
|
|
-
|
|
- totusec = (u_quad_t) p->p_runtime;
|
|
-#else
|
|
sec = p->p_rtime.tv_sec;
|
|
usec = p->p_rtime.tv_usec;
|
|
|
|
totusec = (quad_t)sec * 1000000 + usec;
|
|
-#endif
|
|
|
|
if (totusec < 0) {
|
|
/* XXX no %qd in kernel. Truncate. */
|
|
@@ -116,6 +105,7 @@
|
|
ip->tv_usec = it % 1000000;
|
|
}
|
|
}
|
|
+#endif
|
|
|
|
/* Provides detailed information about a process. */
|
|
|
|
@@ -132,9 +122,6 @@
|
|
struct pstats pstats;
|
|
int count;
|
|
|
|
- char filename [BUFSIZ];
|
|
- struct stat statb;
|
|
-
|
|
glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_PROC_TIME), 0);
|
|
|
|
memset (buf, 0, sizeof (glibtop_proc_time));
|
|
@@ -142,25 +129,23 @@
|
|
/* It does not work for the swapper task. */
|
|
if (pid == 0) return;
|
|
|
|
-#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000))
|
|
+#if (defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000))
|
|
if (server->sysdeps.proc_time == 0)
|
|
return;
|
|
|
|
-#ifndef __bsdi__
|
|
- sprintf (filename, "/proc/%d/mem", (int) pid);
|
|
- if (stat (filename, &statb)) return;
|
|
-#endif
|
|
#endif
|
|
|
|
/* Get the process information */
|
|
pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count);
|
|
- if ((pinfo == NULL) || (count != 1))
|
|
- glibtop_error_io_r (server, "kvm_getprocs (%d)", pid);
|
|
+ if ((pinfo == NULL) || (count != 1)) {
|
|
+ glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid);
|
|
+ return;
|
|
+ }
|
|
|
|
-#if (defined __FreeBSD__) && (__FreeBSD_version >= 300003)
|
|
- buf->rtime = pinfo [0].kp_proc.p_runtime;
|
|
+#if (defined __FreeBSD__) && (__FreeBSD_version >= 500013)
|
|
+ buf->rtime = pinfo [0].ki_runtime;
|
|
#else
|
|
- buf->rtime = tv2sec (pinfo [0].kp_proc.p_rtime);
|
|
+ buf->rtime = pinfo [0].kp_proc.p_runtime;
|
|
#endif
|
|
|
|
buf->frequency = 1000000;
|
|
@@ -192,6 +177,21 @@
|
|
|
|
buf->flags |= _glibtop_sysdeps_proc_time_user;
|
|
#else
|
|
+#if __FreeBSD_version >= 500013
|
|
+#if __FreeBSD_version >= 500016
|
|
+ if ((pinfo [0].ki_sflag & PS_INMEM)) {
|
|
+#else
|
|
+ if ((pinfo [0].ki_flag & P_INMEM)) {
|
|
+#endif
|
|
+ buf->utime = pinfo [0].ki_runtime;
|
|
+ buf->stime = 0; /* XXX */
|
|
+ buf->cutime = tv2sec (pinfo [0].ki_childtime);
|
|
+ buf->cstime = 0; /* XXX */
|
|
+ buf->start_time = tv2sec (pinfo [0].ki_start);
|
|
+ buf->flags |= _glibtop_sysdeps_proc_time_user;
|
|
+ }
|
|
+
|
|
+#else
|
|
glibtop_suid_enter (server);
|
|
|
|
if ((pinfo [0].kp_proc.p_flag & P_INMEM) &&
|
|
@@ -199,31 +199,17 @@
|
|
(unsigned long) &u_addr->u_stats,
|
|
(char *) &pstats, sizeof (pstats)) == sizeof (pstats))
|
|
{
|
|
- /* This is taken form the kernel source code of
|
|
- * FreeBSD 2.2.6. */
|
|
-
|
|
- /* Well, we just do the same getrusage () does ... */
|
|
-
|
|
- register struct rusage *rup;
|
|
|
|
+ buf->utime = tv2sec (pinfo[0].kp_eproc.e_stats.p_ru.ru_utime);
|
|
+ buf->stime = tv2sec (pinfo[0].kp_eproc.e_stats.p_ru.ru_stime);
|
|
+ buf->cutime = tv2sec (pinfo[0].kp_eproc.e_stats.p_cru.ru_utime);
|
|
+ buf->cstime = tv2sec (pinfo[0].kp_eproc.e_stats.p_cru.ru_stime);
|
|
+ buf->start_time = tv2sec (pinfo[0].kp_eproc.e_stats.p_start);
|
|
+ buf->flags |= _glibtop_sysdeps_proc_time_user;
|
|
glibtop_suid_leave (server);
|
|
-
|
|
- rup = &pstats.p_ru;
|
|
- calcru(&(pinfo [0]).kp_proc,
|
|
- &rup->ru_utime, &rup->ru_stime, NULL);
|
|
-
|
|
- buf->utime = tv2sec (pstats.p_ru.ru_utime);
|
|
- buf->stime = tv2sec (pstats.p_ru.ru_stime);
|
|
-
|
|
- buf->cutime = tv2sec (pstats.p_cru.ru_utime);
|
|
- buf->cstime = tv2sec (pstats.p_cru.ru_stime);
|
|
-
|
|
- buf->start_time = tv2sec (pstats.p_start);
|
|
-
|
|
- buf->flags = _glibtop_sysdeps_proc_time_user;
|
|
}
|
|
-
|
|
glibtop_suid_leave (server);
|
|
+#endif
|
|
#endif
|
|
}
|
|
|