mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
First phase of memory management rewrite (see backend/utils/mmgr/README
for details). It doesn't really do that much yet, since there are no short-term memory contexts in the executor, but the infrastructure is in place and long-term contexts are handled reasonably. A few long- standing bugs have been fixed, such as 'VACUUM; anything' in a single query string crashing. Also, out-of-memory is now considered a recoverable ERROR, not FATAL. Eliminate a large amount of crufty, now-dead code in and around memory management. Fix problem with holding off SIGTRAP, SIGSEGV, etc in postmaster and backend startup.
This commit is contained in:
@ -4,14 +4,14 @@
|
||||
# Makefile for lib (miscellaneous stuff)
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $Header: /cvsroot/pgsql/src/backend/lib/Makefile,v 1.13 2000/05/29 05:44:45 tgl Exp $
|
||||
# $Header: /cvsroot/pgsql/src/backend/lib/Makefile,v 1.14 2000/06/28 03:31:34 tgl Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
SRCDIR = ../..
|
||||
include ../../Makefile.global
|
||||
|
||||
OBJS = bit.o fstack.o hasht.o lispsort.o stringinfo.o dllist.o
|
||||
OBJS = bit.o hasht.o lispsort.o stringinfo.o dllist.o
|
||||
|
||||
all: SUBSYS.o
|
||||
|
||||
|
@ -1,145 +0,0 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* fstack.c
|
||||
* Fixed format stack definitions.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/lib/Attic/fstack.c,v 1.14 2000/01/26 05:56:26 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
#include "lib/fstack.h"
|
||||
|
||||
/*
|
||||
* Internal function definitions
|
||||
*/
|
||||
|
||||
/*
|
||||
* FixedItemIsValid
|
||||
* True iff item is valid.
|
||||
*/
|
||||
#define FixedItemIsValid(item) PointerIsValid(item)
|
||||
|
||||
/*
|
||||
* FixedStackGetItemBase
|
||||
* Returns base of enclosing structure.
|
||||
*/
|
||||
#define FixedStackGetItemBase(stack, item) \
|
||||
((Pointer)((char *)(item) - (stack)->offset))
|
||||
|
||||
/*
|
||||
* FixedStackGetItem
|
||||
* Returns item of given pointer to enclosing structure.
|
||||
*/
|
||||
#define FixedStackGetItem(stack, pointer) \
|
||||
((FixedItem)((char *)(pointer) + (stack)->offset))
|
||||
|
||||
#define FixedStackIsValid(stack) ((bool)PointerIsValid(stack))
|
||||
|
||||
/*
|
||||
* External functions
|
||||
*/
|
||||
|
||||
void
|
||||
FixedStackInit(FixedStack stack, Offset offset)
|
||||
{
|
||||
AssertArg(PointerIsValid(stack));
|
||||
|
||||
stack->top = NULL;
|
||||
stack->offset = offset;
|
||||
}
|
||||
|
||||
Pointer
|
||||
FixedStackPop(FixedStack stack)
|
||||
{
|
||||
Pointer pointer;
|
||||
|
||||
AssertArg(FixedStackIsValid(stack));
|
||||
|
||||
if (!PointerIsValid(stack->top))
|
||||
return NULL;
|
||||
|
||||
pointer = FixedStackGetItemBase(stack, stack->top);
|
||||
stack->top = stack->top->next;
|
||||
|
||||
return pointer;
|
||||
}
|
||||
|
||||
void
|
||||
FixedStackPush(FixedStack stack, Pointer pointer)
|
||||
{
|
||||
FixedItem item = FixedStackGetItem(stack, pointer);
|
||||
|
||||
AssertArg(FixedStackIsValid(stack));
|
||||
AssertArg(PointerIsValid(pointer));
|
||||
|
||||
item->next = stack->top;
|
||||
stack->top = item;
|
||||
}
|
||||
|
||||
#ifdef USE_ASSERT_CHECKING
|
||||
/*
|
||||
* FixedStackContains
|
||||
* True iff ordered stack contains given element.
|
||||
*
|
||||
* Note:
|
||||
* This is inefficient. It is intended for debugging use only.
|
||||
*
|
||||
* Exceptions:
|
||||
* BadArg if stack is invalid.
|
||||
* BadArg if pointer is invalid.
|
||||
*/
|
||||
static bool
|
||||
FixedStackContains(FixedStack stack, Pointer pointer)
|
||||
{
|
||||
FixedItem next;
|
||||
FixedItem item;
|
||||
|
||||
AssertArg(FixedStackIsValid(stack));
|
||||
AssertArg(PointerIsValid(pointer));
|
||||
|
||||
item = FixedStackGetItem(stack, pointer);
|
||||
|
||||
for (next = stack->top; FixedItemIsValid(next); next = next->next)
|
||||
{
|
||||
if (next == item)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Pointer
|
||||
FixedStackGetTop(FixedStack stack)
|
||||
{
|
||||
AssertArg(FixedStackIsValid(stack));
|
||||
|
||||
if (!PointerIsValid(stack->top))
|
||||
return NULL;
|
||||
|
||||
return FixedStackGetItemBase(stack, stack->top);
|
||||
}
|
||||
|
||||
Pointer
|
||||
FixedStackGetNext(FixedStack stack, Pointer pointer)
|
||||
{
|
||||
FixedItem item;
|
||||
|
||||
/* AssertArg(FixedStackIsValid(stack)); */
|
||||
/* AssertArg(PointerIsValid(pointer)); */
|
||||
AssertArg(FixedStackContains(stack, pointer));
|
||||
|
||||
item = FixedStackGetItem(stack, pointer)->next;
|
||||
|
||||
if (!PointerIsValid(item))
|
||||
return NULL;
|
||||
|
||||
return FixedStackGetItemBase(stack, item);
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: stringinfo.c,v 1.25 2000/04/12 17:15:11 momjian Exp $
|
||||
* $Id: stringinfo.c,v 1.26 2000/06/28 03:31:34 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -29,8 +29,6 @@ makeStringInfo(void)
|
||||
StringInfo res;
|
||||
|
||||
res = (StringInfo) palloc(sizeof(StringInfoData));
|
||||
if (res == NULL)
|
||||
elog(ERROR, "makeStringInfo: Out of memory");
|
||||
|
||||
initStringInfo(res);
|
||||
|
||||
@ -49,9 +47,6 @@ initStringInfo(StringInfo str)
|
||||
int size = 256; /* initial default buffer size */
|
||||
|
||||
str->data = (char *) palloc(size);
|
||||
if (str->data == NULL)
|
||||
elog(ERROR,
|
||||
"initStringInfo: Out of memory (%d bytes requested)", size);
|
||||
str->maxlen = size;
|
||||
str->len = 0;
|
||||
str->data[0] = '\0';
|
||||
@ -62,6 +57,11 @@ initStringInfo(StringInfo str)
|
||||
*
|
||||
* Internal routine: make sure there is enough space for 'needed' more bytes
|
||||
* ('needed' does not include the terminating null).
|
||||
*
|
||||
* NB: because we use repalloc() to enlarge the buffer, the string buffer
|
||||
* will remain allocated in the same memory context that was current when
|
||||
* initStringInfo was called, even if another context is now current.
|
||||
* This is the desired and indeed critical behavior!
|
||||
*/
|
||||
static void
|
||||
enlargeStringInfo(StringInfo str, int needed)
|
||||
@ -83,9 +83,6 @@ enlargeStringInfo(StringInfo str, int needed)
|
||||
newlen = 2 * newlen;
|
||||
|
||||
str->data = (char *) repalloc(str->data, newlen);
|
||||
if (str->data == NULL)
|
||||
elog(ERROR,
|
||||
"enlargeStringInfo: Out of memory (%d bytes requested)", newlen);
|
||||
|
||||
str->maxlen = newlen;
|
||||
}
|
||||
|
Reference in New Issue
Block a user