diff options
| -rw-r--r-- | src/backend/storage/buffer/localbuf.c | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index 2b783f87f45..29d52b6318a 100644 --- a/src/backend/storage/buffer/localbuf.c +++ b/src/backend/storage/buffer/localbuf.c @@ -9,7 +9,7 @@   *   *   * IDENTIFICATION - *	  $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.89 2010/01/02 16:57:51 momjian Exp $ + *	  $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.89.6.1 2010/08/19 16:16:27 tgl Exp $   *   *-------------------------------------------------------------------------   */ @@ -397,6 +397,7 @@ GetLocalBufferStorage(void)  	static int	next_buf_in_block = 0;  	static int	num_bufs_in_block = 0;  	static int	total_bufs_allocated = 0; +	static MemoryContext LocalBufferContext = NULL;  	char	   *this_buf; @@ -407,6 +408,19 @@ GetLocalBufferStorage(void)  		/* Need to make a new request to memmgr */  		int			num_bufs; +		/* +		 * We allocate local buffers in a context of their own, so that the +		 * space eaten for them is easily recognizable in MemoryContextStats +		 * output.  Create the context on first use. +		 */ +		if (LocalBufferContext == NULL) +			LocalBufferContext = +				AllocSetContextCreate(TopMemoryContext, +									  "LocalBufferContext", +									  ALLOCSET_DEFAULT_MINSIZE, +									  ALLOCSET_DEFAULT_INITSIZE, +									  ALLOCSET_DEFAULT_MAXSIZE); +  		/* Start with a 16-buffer request; subsequent ones double each time */  		num_bufs = Max(num_bufs_in_block * 2, 16);  		/* But not more than what we need for all remaining local bufs */ @@ -414,8 +428,7 @@ GetLocalBufferStorage(void)  		/* And don't overflow MaxAllocSize, either */  		num_bufs = Min(num_bufs, MaxAllocSize / BLCKSZ); -		/* Allocate space from TopMemoryContext so it never goes away */ -		cur_block = (char *) MemoryContextAlloc(TopMemoryContext, +		cur_block = (char *) MemoryContextAlloc(LocalBufferContext,  												num_bufs * BLCKSZ);  		next_buf_in_block = 0;  		num_bufs_in_block = num_bufs;  | 
