Module Name: src Committed By: sjg Date: Tue Apr 24 20:26:58 UTC 2012
Modified Files: src/usr.bin/make: buf.c buf.h var.c Log Message: Var* are generally very liberal with memory, with the expectation that none of it persists for long. This isn't always true - for example a long running .for loop. Buf_DestroyCompact() is used by Var_Subst(), rather than Buf_Destroy(). If it looks like we can save BUF_COMPACT_LIMIT (128) or more bytes, call realloc. This can reduce memory consumption by about 20% Setting BUF_COMPACT_LIMIT to 0 dissables this. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/usr.bin/make/buf.c cvs rdiff -u -r1.16 -r1.17 src/usr.bin/make/buf.h cvs rdiff -u -r1.167 -r1.168 src/usr.bin/make/var.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/buf.c diff -u src/usr.bin/make/buf.c:1.24 src/usr.bin/make/buf.c:1.25 --- src/usr.bin/make/buf.c:1.24 Sat Jan 17 13:29:37 2009 +++ src/usr.bin/make/buf.c Tue Apr 24 20:26:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: buf.c,v 1.24 2009/01/17 13:29:37 dsl Exp $ */ +/* $NetBSD: buf.c,v 1.25 2012/04/24 20:26:58 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -70,14 +70,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: buf.c,v 1.24 2009/01/17 13:29:37 dsl Exp $"; +static char rcsid[] = "$NetBSD: buf.c,v 1.25 2012/04/24 20:26:58 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)buf.c 8.1 (Berkeley) 6/6/93"; #else -__RCSID("$NetBSD: buf.c,v 1.24 2009/01/17 13:29:37 dsl Exp $"); +__RCSID("$NetBSD: buf.c,v 1.25 2012/04/24 20:26:58 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -248,3 +248,44 @@ Buf_Destroy(Buffer *buf, Boolean freeDat return data; } + + +/*- + *----------------------------------------------------------------------- + * Buf_DestroyCompact -- + * Nuke a buffer and return its data. + * + * Input: + * buf Buffer to destroy + * + * Results: + * Data buffer + * + * Side Effects: + * If the buffer size is much greater than its content, + * a new buffer will be allocated and the old one freed. + * + *----------------------------------------------------------------------- + */ +#ifndef BUF_COMPACT_LIMIT +# define BUF_COMPACT_LIMIT 128 /* worthwhile saving */ +#endif + +Byte * +Buf_DestroyCompact(Buffer *buf) +{ +#if BUF_COMPACT_LIMIT > 0 + Byte *data; + + if (buf->size - buf->count >= BUF_COMPACT_LIMIT) { + /* We trust realloc to be smart */ + data = bmake_realloc(buf->buffer, buf->count + 1); + if (data) { + data[buf->count] = 0; + Buf_Destroy(buf, FALSE); + return data; + } + } +#endif + return Buf_Destroy(buf, FALSE); +} Index: src/usr.bin/make/buf.h diff -u src/usr.bin/make/buf.h:1.16 src/usr.bin/make/buf.h:1.17 --- src/usr.bin/make/buf.h:1.16 Sat Jan 17 13:55:42 2009 +++ src/usr.bin/make/buf.h Tue Apr 24 20:26:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: buf.h,v 1.16 2009/01/17 13:55:42 dsl Exp $ */ +/* $NetBSD: buf.h,v 1.17 2012/04/24 20:26:58 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -114,5 +114,6 @@ Byte *Buf_GetAll(Buffer *, int *); void Buf_Empty(Buffer *); void Buf_Init(Buffer *, int); Byte *Buf_Destroy(Buffer *, Boolean); +Byte *Buf_DestroyCompact(Buffer *); #endif /* _BUF_H */ Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.167 src/usr.bin/make/var.c:1.168 --- src/usr.bin/make/var.c:1.167 Fri Jun 3 21:10:42 2011 +++ src/usr.bin/make/var.c Tue Apr 24 20:26:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.167 2011/06/03 21:10:42 sjg Exp $ */ +/* $NetBSD: var.c,v 1.168 2012/04/24 20:26:58 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.167 2011/06/03 21:10:42 sjg Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.168 2012/04/24 20:26:58 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.167 2011/06/03 21:10:42 sjg Exp $"); +__RCSID("$NetBSD: var.c,v 1.168 2012/04/24 20:26:58 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -4075,7 +4075,7 @@ Var_Subst(const char *var, const char *s } } - return Buf_Destroy(&buf, FALSE); + return Buf_DestroyCompact(&buf); } /*-