Don't malloc/free the swap pointer with each refresh! Do it only if the
number of swap devices change. Now (and with the kvm fixes) top does not allocate/free memory on each refresh.
This commit is contained in:
parent
0213791d0c
commit
10416487f0
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: m_netbsd15.c,v 1.24 2005/10/03 05:34:51 christos Exp $ */
|
/* $NetBSD: m_netbsd15.c,v 1.25 2006/02/16 20:50:57 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* top - a top users display for Unix
|
* top - a top users display for Unix
|
||||||
@ -36,12 +36,12 @@
|
|||||||
* Tomas Svensson <ts@unix1.net>
|
* Tomas Svensson <ts@unix1.net>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* $Id: m_netbsd15.c,v 1.24 2005/10/03 05:34:51 christos Exp $
|
* $Id: m_netbsd15.c,v 1.25 2006/02/16 20:50:57 christos Exp $
|
||||||
*/
|
*/
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
__RCSID("$NetBSD: m_netbsd15.c,v 1.24 2005/10/03 05:34:51 christos Exp $");
|
__RCSID("$NetBSD: m_netbsd15.c,v 1.25 2006/02/16 20:50:57 christos Exp $");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
@ -195,6 +195,8 @@ static int onproc = -1;
|
|||||||
static int pref_len;
|
static int pref_len;
|
||||||
static struct kinfo_proc2 *pbase;
|
static struct kinfo_proc2 *pbase;
|
||||||
static struct kinfo_proc2 **pref;
|
static struct kinfo_proc2 **pref;
|
||||||
|
static int maxswap;
|
||||||
|
static void *swapp;
|
||||||
|
|
||||||
/* these are for getting the memory statistics */
|
/* these are for getting the memory statistics */
|
||||||
|
|
||||||
@ -338,7 +340,7 @@ get_system_info(si)
|
|||||||
size_t ssize;
|
size_t ssize;
|
||||||
int mib[2];
|
int mib[2];
|
||||||
struct uvmexp_sysctl uvmexp;
|
struct uvmexp_sysctl uvmexp;
|
||||||
struct swapent *sep, *seporig;
|
struct swapent *sep;
|
||||||
struct timeval boottime;
|
struct timeval boottime;
|
||||||
u_int64_t totalsize, totalinuse;
|
u_int64_t totalsize, totalinuse;
|
||||||
time_t now;
|
time_t now;
|
||||||
@ -388,18 +390,19 @@ get_system_info(si)
|
|||||||
|
|
||||||
swap_stats[0] = swap_stats[1] = swap_stats[2] = 0;
|
swap_stats[0] = swap_stats[1] = swap_stats[2] = 0;
|
||||||
|
|
||||||
seporig = NULL;
|
|
||||||
do {
|
do {
|
||||||
nswap = swapctl(SWAP_NSWAP, 0, 0);
|
nswap = swapctl(SWAP_NSWAP, 0, 0);
|
||||||
if (nswap < 1)
|
if (nswap < 1)
|
||||||
break;
|
break;
|
||||||
/* Use seporig to keep track of the malloc'd memory
|
if (nswap > maxswap) {
|
||||||
* base, as sep will be incremented in the for loop
|
if (swapp)
|
||||||
* below.
|
free(swapp);
|
||||||
*/
|
swapp = sep = malloc(nswap * sizeof(*sep));
|
||||||
seporig = sep = (struct swapent *)malloc(nswap * sizeof(*sep));
|
|
||||||
if (sep == NULL)
|
if (sep == NULL)
|
||||||
break;
|
break;
|
||||||
|
maxswap = nswap;
|
||||||
|
} else
|
||||||
|
sep = swapp;
|
||||||
rnswap = swapctl(SWAP_STATS, (void *)sep, nswap);
|
rnswap = swapctl(SWAP_STATS, (void *)sep, nswap);
|
||||||
if (nswap != rnswap)
|
if (nswap != rnswap)
|
||||||
break;
|
break;
|
||||||
@ -415,19 +418,7 @@ get_system_info(si)
|
|||||||
swap_stats[0] = dbtob(totalsize) / 1024;
|
swap_stats[0] = dbtob(totalsize) / 1024;
|
||||||
swap_stats[1] = dbtob(totalinuse) / 1024;
|
swap_stats[1] = dbtob(totalinuse) / 1024;
|
||||||
swap_stats[2] = dbtob(totalsize) / 1024 - swap_stats[1];
|
swap_stats[2] = dbtob(totalsize) / 1024 - swap_stats[1];
|
||||||
/* Free here, before we malloc again in the next
|
|
||||||
* iteration of this loop.
|
|
||||||
*/
|
|
||||||
if (seporig) {
|
|
||||||
free(seporig);
|
|
||||||
seporig = NULL;
|
|
||||||
}
|
|
||||||
} while (0);
|
} while (0);
|
||||||
/* Catch the case where we malloc'd, but then exited the
|
|
||||||
* loop due to nswap != rnswap.
|
|
||||||
*/
|
|
||||||
if (seporig)
|
|
||||||
free(seporig);
|
|
||||||
|
|
||||||
memory_stats[6] = -1;
|
memory_stats[6] = -1;
|
||||||
swap_stats[3] = -1;
|
swap_stats[3] = -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user