From fac354623b47d6d65bb3691c9a7f5c210feb8a7c Mon Sep 17 00:00:00 2001 From: Timur Bakeyev Date: Thu, 8 Apr 1999 20:21:38 +0000 Subject: [PATCH] Added initial port for BSD/OS (aka BSDI) 2.x and 3.x. 4.x should also(?) Thu Apr 8 23:47:29 1999 Timur Bakeyev * cpu.c, mem.c, netload.c, procargs.c, procstate.c, proctime.c, sem_limits.c, shm_limits.c, swap.c: Added initial port for BSD/OS (aka BSDI) 2.x and 3.x. 4.x should also(?) work. Still, this port require more close look and extended check. --- .cvsignore | 1 + ChangeLog | 8 +++++ examples/ChangeLog | 5 +++ examples/timings.c | 21 ++++++++++++ stamp-h.in | 1 - sysdeps/freebsd/cpu.c | 4 +++ sysdeps/freebsd/mem.c | 24 ++++++-------- sysdeps/freebsd/netload.c | 14 ++++---- sysdeps/freebsd/procargs.c | 4 +++ sysdeps/freebsd/procstate.c | 3 +- sysdeps/freebsd/proctime.c | 2 ++ sysdeps/freebsd/sem_limits.c | 4 +-- sysdeps/freebsd/shm_limits.c | 4 +-- sysdeps/freebsd/swap.c | 63 ++++++++++++++++++++++++++---------- 14 files changed, 113 insertions(+), 45 deletions(-) delete mode 100644 stamp-h.in diff --git a/.cvsignore b/.cvsignore index 8dd8995d..caa215c1 100644 --- a/.cvsignore +++ b/.cvsignore @@ -21,6 +21,7 @@ ltconfig ltmain.sh macros stamp-h +stamp-h.in sun4 sun4sol2 support diff --git a/ChangeLog b/ChangeLog index 2f6a3fe3..90d11af7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Apr 8 23:47:29 1999 Timur Bakeyev + + * cpu.c, mem.c, netload.c, procargs.c, procstate.c, proctime.c, + sem_limits.c, shm_limits.c, swap.c: Added initial port for BSD/OS + (aka BSDI) 2.x and 3.x. 4.x should also(?) work. + + Still, this port require more close look and extended check. + 1999-03-30 Martin Baulig Added some new features. diff --git a/examples/ChangeLog b/examples/ChangeLog index c4ed58ce..61844ddd 100644 --- a/examples/ChangeLog +++ b/examples/ChangeLog @@ -1,3 +1,8 @@ +Fri Apr 9 00:14:52 1999 Timur Bakeyev + + * timings.c: Added timersub defenition, to make code compilable on + BSDI. + 1999-03-24 Martin Baulig * timings.c: New example. diff --git a/examples/timings.c b/examples/timings.c index 28910522..6b79ac21 100644 --- a/examples/timings.c +++ b/examples/timings.c @@ -47,6 +47,27 @@ #define ELAPSED_UTIME ((unsigned long) elapsed_utime.tv_sec * 1000000 + (unsigned long) elapsed_utime.tv_usec) #define ELAPSED_STIME ((unsigned long) elapsed_stime.tv_sec * 1000000 + (unsigned long) elapsed_stime.tv_usec) +#if defined(__bsdi__) +#define timeradd(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (0) +#define timersub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) +#endif + int main (int argc, char *argv []) { diff --git a/stamp-h.in b/stamp-h.in deleted file mode 100644 index 9788f702..00000000 --- a/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/sysdeps/freebsd/cpu.c b/sysdeps/freebsd/cpu.c index 647271f2..972b338a 100644 --- a/sysdeps/freebsd/cpu.c +++ b/sysdeps/freebsd/cpu.c @@ -34,7 +34,11 @@ static const unsigned long _glibtop_sysdeps_cpu = /* nlist structure for kernel access */ static struct nlist nlst [] = { +#ifdef __bsdi__ + { "_cpustats" }, +#else { "_cp_time" }, +#endif { 0 } }; diff --git a/sysdeps/freebsd/mem.c b/sysdeps/freebsd/mem.c index 1a7eaa24..e8b774d8 100644 --- a/sysdeps/freebsd/mem.c +++ b/sysdeps/freebsd/mem.c @@ -28,17 +28,13 @@ #include #include -#ifndef __bsdi__ #include -#endif #include static const unsigned long _glibtop_sysdeps_mem = (1 << GLIBTOP_MEM_TOTAL) + (1 << GLIBTOP_MEM_USED) + (1 << GLIBTOP_MEM_FREE) + -#ifndef __bsdi__ (1 << GLIBTOP_MEM_SHARED) + -#endif (1 << GLIBTOP_MEM_BUFFER) + #ifdef __FreeBSD__ (1 << GLIBTOP_MEM_CACHED) + @@ -58,7 +54,9 @@ static int pageshift; /* log base 2 of the pagesize */ /* nlist structure for kernel access */ static struct nlist nlst [] = { { "_cnt" }, -#ifdef __FreeBSD__ +#if defined(__bsdi__) + { "_bufcachemem" }, +#elif defined(__FreeBSD__) { "_bufspace" }, #else { "_bufpages" }, @@ -66,11 +64,13 @@ static struct nlist nlst [] = { { 0 } }; -#ifndef __bsdi__ /* MIB array for sysctl */ -/* static int mib_length=2; */ +static int mib_length=2; +#ifdef __bsdi__ +static int mib [] = { CTL_VM, VM_TOTAL }; +#else static int mib [] = { CTL_VM, VM_METER }; -#endif /* __bsdi__ */ +#endif /* Init function. */ @@ -102,10 +102,8 @@ glibtop_init_mem_p (glibtop *server) void glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) { -#ifndef __bsdi__ struct vmtotal vmt; size_t length_vmt; -#endif struct vmmeter vmm; u_int v_used_count; u_int v_total_count; @@ -118,7 +116,6 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) if (server->sysdeps.mem == 0) return; -#ifndef __bsdi__ /* [FIXME: On FreeBSD 2.2.6, sysctl () returns an incorrect * value for `vmt.vm'. We use some code from Unix top * here.] */ @@ -129,7 +126,6 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) glibtop_warn_io_r (server, "sysctl"); return; } -#endif /* Get the data from kvm_* */ if (kvm_read (server->machine.kd, nlst[0].n_value, @@ -146,7 +142,7 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) /* convert memory stats to Kbytes */ -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) v_total_count = vmm.v_page_count; #else v_total_count = vmm.v_kernel_pages + @@ -165,9 +161,7 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) #endif buf->locked = (u_int64_t) pagetok (vmm.v_wire_count) << LOG1024; -#ifndef __bsdi__ buf->shared = (u_int64_t) pagetok (vmt.t_rmshr) << LOG1024; -#endif #if __FreeBSD__ buf->buffer = (u_int64_t) bufspace; diff --git a/sysdeps/freebsd/netload.c b/sysdeps/freebsd/netload.c index 8d763a7a..30821048 100644 --- a/sysdeps/freebsd/netload.c +++ b/sysdeps/freebsd/netload.c @@ -107,7 +107,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, sizeof (ifnet)) != sizeof (ifnet)) glibtop_error_io_r (server, "kvm_read (ifnetaddr)"); -#if (defined __FreeBSD__) || (defined __bsdi__) +#if defined(__FreeBSD__) || defined(__bsdi__) if (kvm_read (server->machine.kd, (u_long) ifnet.if_name, tname, 16) != 16) glibtop_error_io_r (server, "kvm_read (if_name)"); @@ -116,9 +116,9 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, tname [15] = 0; #endif -#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000) +#if defined(__FreeBSD__) && (__FreeBSD_version >= 300000) ifaddraddr = (u_long) ifnet.if_addrhead.tqh_first; -#elif (defined __FreeBSD__) || (defined __bsdi__) +#elif defined(__FreeBSD__) || defined(__bsdi__) ifaddraddr = (u_long) ifnet.if_addrlist; #else ifaddraddr = (u_long) ifnet.if_addrlist.tqh_first; @@ -194,18 +194,18 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, return; } -#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000) +#if defined(__FreeBSD__) && (__FreeBSD_version >= 300000) ifaddraddr = (u_long)ifaddr.ifa.ifa_link.tqe_next; -#elif (defined __FreeBSD__) || (defined __bsdi__) +#elif defined(__FreeBSD__) || defined(__bsdi__) ifaddraddr = (u_long)ifaddr.ifa.ifa_next; #else ifaddraddr = (u_long)ifaddr.ifa.ifa_list.tqe_next; #endif } -#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000) +#if defined(__FreeBSD__) && (__FreeBSD_version >= 300000) ifnetaddr = (u_long) ifnet.if_link.tqe_next; -#elif (defined __FreeBSD__) || (defined __bsdi__) +#elif defined(__FreeBSD__) || defined(__bsdi__) ifnetaddr = (u_long) ifnet.if_next; #else ifnetaddr = (u_long) ifnet.if_list.tqe_next; diff --git a/sysdeps/freebsd/procargs.c b/sysdeps/freebsd/procargs.c index c6d0c1b5..84a0a619 100644 --- a/sysdeps/freebsd/procargs.c +++ b/sysdeps/freebsd/procargs.c @@ -54,8 +54,10 @@ glibtop_get_proc_args_p (glibtop *server, glibtop_proc_args *buf, unsigned size = 0, pos = 0; int count; +#ifndef __bsdi__ char filename [BUFSIZ]; struct stat statb; +#endif glibtop_init_p (server, (1 << GLIBTOP_SYSDEPS_PROC_ARGS), 0); @@ -64,8 +66,10 @@ glibtop_get_proc_args_p (glibtop *server, glibtop_proc_args *buf, /* swapper, init, pagedaemon, vmdaemon, update - this doen't work. */ if (pid < 5) return NULL; +#ifndef __bsdi__ sprintf (filename, "/proc/%d/mem", pid); if (stat (filename, &statb)) return NULL; +#endif glibtop_suid_enter (server); diff --git a/sysdeps/freebsd/procstate.c b/sysdeps/freebsd/procstate.c index 74c4e3b1..e1a2476d 100644 --- a/sysdeps/freebsd/procstate.c +++ b/sysdeps/freebsd/procstate.c @@ -27,7 +27,8 @@ #include -#if (!defined __OpenBSD__) && (!defined __bsdi__) +#if !defined(__OpenBSD__) +//&& (!defined __bsdi__) #include #endif diff --git a/sysdeps/freebsd/proctime.c b/sysdeps/freebsd/proctime.c index 65104acf..0f4384b9 100644 --- a/sysdeps/freebsd/proctime.c +++ b/sysdeps/freebsd/proctime.c @@ -140,8 +140,10 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf, /* It does not work for the swapper task. */ if (pid == 0) return; +#ifndef __bsdi__ sprintf (filename, "/proc/%d/mem", (int) pid); if (stat (filename, &statb)) return; +#endif /* Get the process information */ pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); diff --git a/sysdeps/freebsd/sem_limits.c b/sysdeps/freebsd/sem_limits.c index 804e55c4..a52b82f9 100644 --- a/sysdeps/freebsd/sem_limits.c +++ b/sysdeps/freebsd/sem_limits.c @@ -27,7 +27,7 @@ #include -#if (defined __bsdi__) && (_BSDI_VERSION < 199700) +#if defined(__bsdi__) && (_BSDI_VERSION < 199700) /* Older versions of BSDI don't seem to have this. */ void @@ -46,7 +46,7 @@ glibtop_get_sem_limits_p (glibtop *server, glibtop_sem_limits *buf) /* #define KERNEL to get declaration of `struct seminfo'. */ -#if (defined __FreeBSD__) || (defined __bsdi__) +#if defined(__FreeBSD__) || defined(__bsdi__) #define KERNEL 1 #else #define _KERNEL 1 diff --git a/sysdeps/freebsd/shm_limits.c b/sysdeps/freebsd/shm_limits.c index fd06dc3d..0d049549 100644 --- a/sysdeps/freebsd/shm_limits.c +++ b/sysdeps/freebsd/shm_limits.c @@ -27,7 +27,7 @@ #include -#if (defined __bsdi__) && (_BSDI_VERSION < 199700) +#if defined(__bsdi__) && (_BSDI_VERSION < 199700) /* Older versions of BSDI don't seem to have this. */ void @@ -46,7 +46,7 @@ glibtop_get_shm_limits_p (glibtop *server, glibtop_shm_limits *buf) /* #define KERNEL to get declaration of `struct shminfo'. */ -#if (defined __FreeBSD__) || (defined __bsdi__) +#if defined(__FreeBSD__) || defined(__bsdi__) #define KERNEL 1 #else #define _KERNEL 1 diff --git a/sysdeps/freebsd/swap.c b/sysdeps/freebsd/swap.c index 1b0f2ad2..b6980b3e 100644 --- a/sysdeps/freebsd/swap.c +++ b/sysdeps/freebsd/swap.c @@ -34,15 +34,24 @@ static const unsigned long _glibtop_sysdeps_swap = (1 << GLIBTOP_SWAP_FREE) + (1 << GLIBTOP_SWAP_PAGEIN) + (1 << GLIBTOP_SWAP_PAGEOUT); -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__bsdi__) #include +#ifdef __bsdi__ +#include +#else #include +#endif #include -#if __FreeBSD__ < 4 - /* nlist structure for kernel access */ + +#if defined(__bsdi__) +static struct nlist nlst [] = { + { "_swapstats" }, /* general swap info */ + { 0 } +}; +#elif __FreeBSD__ < 4 static struct nlist nlst [] = { #define VM_SWAPLIST 0 { "_swaplist" },/* list of free swap areas */ @@ -56,10 +65,9 @@ static struct nlist nlst [] = { { "_dmmax" }, /* maximum size of a swap block */ { 0 } }; - #endif -#elif (defined __NetBSD__) +#elif defined(__NetBSD__) #include @@ -76,8 +84,8 @@ static struct nlist nlst2 [] = { void glibtop_init_swap_p (glibtop *server) { -#ifdef __FreeBSD__ -#if __FreeBSD__ < 4 +#if defined(__FreeBSD__) || defined(__bsdi__) +#if __FreeBSD__ < 4 || defined(__bsdi__) if (kvm_nlist (server->machine.kd, nlst) != 0) { glibtop_warn_io_r (server, "kvm_nlist (swap)"); return; @@ -86,14 +94,14 @@ glibtop_init_swap_p (glibtop *server) struct kvm_swap dummy; if (kvm_getswapinfo (server->machine.kd, &dummy, 1, 0) != 0) { - glibtop_warn_io_r (server, "kvm_nlist (swap)"); + glibtop_warn_io_r (server, "kvm_swap (swap)"); return; } #endif #endif if (kvm_nlist (server->machine.kd, nlst2) != 0) { - glibtop_warn_io_r (server, "kvm_nlist (swap)"); + glibtop_warn_io_r (server, "kvm_nlist (cnt)"); return; } @@ -110,8 +118,9 @@ glibtop_init_swap_p (glibtop *server) void glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) { -#ifdef __FreeBSD__ -#if __FreeBSD__ < 4 +#if defined(__FreeBSD__) + +# if __FreeBSD__ < 4 char *header; int hlen, nswdev, dmmax; int div, nfree, npfree; @@ -122,11 +131,14 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) struct rlist *swapptr; size_t sw_size; u_long ptr; -#else +# else int nswdev; struct kvm_swap kvmsw[16]; -#endif -#elif (defined __NetBSD__) +# endif + +#elif defined(__bsdi__) + struct swapstats swap; +#elif defined(__NetBSD__) struct swapent *swaplist; #endif @@ -174,7 +186,7 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) swappgsout = vmm.v_swpout; #endif -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) #if __FreeBSD__ < 4 @@ -214,7 +226,7 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) if (kvm_read (server->machine.kd, nlst[VM_SWDEVT].n_value, &ptr, sizeof (ptr)) != sizeof (ptr)) { - glibtop_warn_io_r (server, "kvm_read (swaplist)"); + glibtop_warn_io_r (server, "kvm_read (swdevt)"); return; } @@ -328,7 +340,24 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) #endif -#elif (defined __NetBSD__) +#elif defined(__bsdi__) + + /* General info about swap devices. */ + + if (kvm_read (server->machine.kd, nlst[0].n_value, + &swap, sizeof (swap)) != sizeof (swap)) { + glibtop_warn_io_r (server, "kvm_read (swap)"); + return; + } + + buf->flags = _glibtop_sysdeps_swap; + + buf->used = swap.swap_total - swap.swap_free; + buf->free = swap.swap_free; + + buf->total = swap.swap_total; + +#elif defined(__NetBSD__) nswap = swapctl (SWAP_NSWAP, NULL, 0); if (nswap < 0) {