diff options
author | des <des@FreeBSD.org> | 1998-10-12 20:36:33 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 1998-10-12 20:36:33 +0000 |
commit | 8eaab1764cab145597a7e2574f238594639dd9ec (patch) | |
tree | 30684161ccd9c4d83cf232b015dbdd9fc16691a0 /lib/libkvm/kvm_proc.c | |
parent | 016509e2471290bfe1dd1dd32cdf524c7c0f9051 (diff) | |
download | FreeBSD-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/kvm_proc.c')
-rw-r--r-- | lib/libkvm/kvm_proc.c | 14 |
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); |