summaryrefslogtreecommitdiffstats
path: root/lib/libkvm
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>1998-10-12 20:36:33 +0000
committerdes <des@FreeBSD.org>1998-10-12 20:36:33 +0000
commit8eaab1764cab145597a7e2574f238594639dd9ec (patch)
tree30684161ccd9c4d83cf232b015dbdd9fc16691a0 /lib/libkvm
parent016509e2471290bfe1dd1dd32cdf524c7c0f9051 (diff)
downloadFreeBSD-src-8eaab1764cab145597a7e2574f238594639dd9ec.zip
FreeBSD-src-8eaab1764cab145597a7e2574f238594639dd9ec.tar.gz
Avoid the "Cannot allocate memory" problem that appears on heavily
loaded systems by retrying the sysctl() with a larger buffer if it fails with ENOMEM. For good measure, allocate 10% more memory than sysctl() claims is necessary. PR: 8275 Reviewed by: David Greenman <dg@freebsd.org>
Diffstat (limited to 'lib/libkvm')
-rw-r--r--lib/libkvm/kvm_proc.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index 4bcc2e5..c917861 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -302,10 +302,16 @@ kvm_getprocs(kd, op, arg, cnt)
_kvm_syserr(kd, kd->program, "kvm_getprocs");
return (0);
}
- kd->procbase = (struct kinfo_proc *)_kvm_malloc(kd, size);
- if (kd->procbase == 0)
- return (0);
- st = sysctl(mib, op == KERN_PROC_ALL ? 3 : 4, kd->procbase, &size, NULL, 0);
+ kd->procbase = 0;
+ do {
+ size += size / 10;
+ kd->procbase = (struct kinfo_proc *)
+ _kvm_realloc(kd, kd->procbase, size);
+ if (kd->procbase == 0)
+ return (0);
+ st = sysctl(mib, op == KERN_PROC_ALL ? 3 : 4,
+ kd->procbase, &size, NULL, 0);
+ } while (st == -1 && errno == ENOMEM);
if (st == -1) {
_kvm_syserr(kd, kd->program, "kvm_getprocs");
return (0);
OpenPOWER on IntegriCloud