resowner.c

来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 938 行 · 第 1/2 页

C
938
字号
 * outside any transaction (for example, during WAL recovery). */voidResourceOwnerEnlargeBuffers(ResourceOwner owner){	int			newmax;	if (owner == NULL ||		owner->nbuffers < owner->maxbuffers)		return;					/* nothing to do */	if (owner->buffers == NULL)	{		newmax = 16;		owner->buffers = (Buffer *)			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer));		owner->maxbuffers = newmax;	}	else	{		newmax = owner->maxbuffers * 2;		owner->buffers = (Buffer *)			repalloc(owner->buffers, newmax * sizeof(Buffer));		owner->maxbuffers = newmax;	}}/* * Remember that a buffer pin is owned by a ResourceOwner * * Caller must have previously done ResourceOwnerEnlargeBuffers() * * We allow the case owner == NULL because the bufmgr is sometimes invoked * outside any transaction (for example, during WAL recovery). */voidResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer){	if (owner != NULL)	{		Assert(owner->nbuffers < owner->maxbuffers);		owner->buffers[owner->nbuffers] = buffer;		owner->nbuffers++;	}}/* * Forget that a buffer pin is owned by a ResourceOwner * * We allow the case owner == NULL because the bufmgr is sometimes invoked * outside any transaction (for example, during WAL recovery). */voidResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer){	if (owner != NULL)	{		Buffer	   *buffers = owner->buffers;		int			nb1 = owner->nbuffers - 1;		int			i;		/*		 * Scan back-to-front because it's more likely we are releasing a		 * recently pinned buffer.	This isn't always the case of course, but		 * it's the way to bet.		 */		for (i = nb1; i >= 0; i--)		{			if (buffers[i] == buffer)			{				while (i < nb1)				{					buffers[i] = buffers[i + 1];					i++;				}				owner->nbuffers = nb1;				return;			}		}		elog(ERROR, "buffer %d is not owned by resource owner %s",			 buffer, owner->name);	}}/* * Make sure there is room for at least one more entry in a ResourceOwner's * catcache reference array. * * This is separate from actually inserting an entry because if we run out * of memory, it's critical to do so *before* acquiring the resource. */voidResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner){	int			newmax;	if (owner->ncatrefs < owner->maxcatrefs)		return;					/* nothing to do */	if (owner->catrefs == NULL)	{		newmax = 16;		owner->catrefs = (HeapTuple *)			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(HeapTuple));		owner->maxcatrefs = newmax;	}	else	{		newmax = owner->maxcatrefs * 2;		owner->catrefs = (HeapTuple *)			repalloc(owner->catrefs, newmax * sizeof(HeapTuple));		owner->maxcatrefs = newmax;	}}/* * Remember that a catcache reference is owned by a ResourceOwner * * Caller must have previously done ResourceOwnerEnlargeCatCacheRefs() */voidResourceOwnerRememberCatCacheRef(ResourceOwner owner, HeapTuple tuple){	Assert(owner->ncatrefs < owner->maxcatrefs);	owner->catrefs[owner->ncatrefs] = tuple;	owner->ncatrefs++;}/* * Forget that a catcache reference is owned by a ResourceOwner */voidResourceOwnerForgetCatCacheRef(ResourceOwner owner, HeapTuple tuple){	HeapTuple  *catrefs = owner->catrefs;	int			nc1 = owner->ncatrefs - 1;	int			i;	for (i = nc1; i >= 0; i--)	{		if (catrefs[i] == tuple)		{			while (i < nc1)			{				catrefs[i] = catrefs[i + 1];				i++;			}			owner->ncatrefs = nc1;			return;		}	}	elog(ERROR, "catcache reference %p is not owned by resource owner %s",		 tuple, owner->name);}/* * Make sure there is room for at least one more entry in a ResourceOwner's * catcache-list reference array. * * This is separate from actually inserting an entry because if we run out * of memory, it's critical to do so *before* acquiring the resource. */voidResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner){	int			newmax;	if (owner->ncatlistrefs < owner->maxcatlistrefs)		return;					/* nothing to do */	if (owner->catlistrefs == NULL)	{		newmax = 16;		owner->catlistrefs = (CatCList **)			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CatCList *));		owner->maxcatlistrefs = newmax;	}	else	{		newmax = owner->maxcatlistrefs * 2;		owner->catlistrefs = (CatCList **)			repalloc(owner->catlistrefs, newmax * sizeof(CatCList *));		owner->maxcatlistrefs = newmax;	}}/* * Remember that a catcache-list reference is owned by a ResourceOwner * * Caller must have previously done ResourceOwnerEnlargeCatCacheListRefs() */voidResourceOwnerRememberCatCacheListRef(ResourceOwner owner, CatCList *list){	Assert(owner->ncatlistrefs < owner->maxcatlistrefs);	owner->catlistrefs[owner->ncatlistrefs] = list;	owner->ncatlistrefs++;}/* * Forget that a catcache-list reference is owned by a ResourceOwner */voidResourceOwnerForgetCatCacheListRef(ResourceOwner owner, CatCList *list){	CatCList  **catlistrefs = owner->catlistrefs;	int			nc1 = owner->ncatlistrefs - 1;	int			i;	for (i = nc1; i >= 0; i--)	{		if (catlistrefs[i] == list)		{			while (i < nc1)			{				catlistrefs[i] = catlistrefs[i + 1];				i++;			}			owner->ncatlistrefs = nc1;			return;		}	}	elog(ERROR, "catcache list reference %p is not owned by resource owner %s",		 list, owner->name);}/* * Make sure there is room for at least one more entry in a ResourceOwner's * relcache reference array. * * This is separate from actually inserting an entry because if we run out * of memory, it's critical to do so *before* acquiring the resource. */voidResourceOwnerEnlargeRelationRefs(ResourceOwner owner){	int			newmax;	if (owner->nrelrefs < owner->maxrelrefs)		return;					/* nothing to do */	if (owner->relrefs == NULL)	{		newmax = 16;		owner->relrefs = (Relation *)			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Relation));		owner->maxrelrefs = newmax;	}	else	{		newmax = owner->maxrelrefs * 2;		owner->relrefs = (Relation *)			repalloc(owner->relrefs, newmax * sizeof(Relation));		owner->maxrelrefs = newmax;	}}/* * Remember that a relcache reference is owned by a ResourceOwner * * Caller must have previously done ResourceOwnerEnlargeRelationRefs() */voidResourceOwnerRememberRelationRef(ResourceOwner owner, Relation rel){	Assert(owner->nrelrefs < owner->maxrelrefs);	owner->relrefs[owner->nrelrefs] = rel;	owner->nrelrefs++;}/* * Forget that a relcache reference is owned by a ResourceOwner */voidResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel){	Relation   *relrefs = owner->relrefs;	int			nr1 = owner->nrelrefs - 1;	int			i;	for (i = nr1; i >= 0; i--)	{		if (relrefs[i] == rel)		{			while (i < nr1)			{				relrefs[i] = relrefs[i + 1];				i++;			}			owner->nrelrefs = nr1;			return;		}	}	elog(ERROR, "relcache reference %s is not owned by resource owner %s",		 RelationGetRelationName(rel), owner->name);}/* * Debugging subroutine */static voidPrintRelCacheLeakWarning(Relation rel){	elog(WARNING, "relcache reference leak: relation \"%s\" not closed",		 RelationGetRelationName(rel));}/* * Make sure there is room for at least one more entry in a ResourceOwner's * plancache reference array. * * This is separate from actually inserting an entry because if we run out * of memory, it's critical to do so *before* acquiring the resource. */voidResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner){	int			newmax;	if (owner->nplanrefs < owner->maxplanrefs)		return;					/* nothing to do */	if (owner->planrefs == NULL)	{		newmax = 16;		owner->planrefs = (CachedPlan **)			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CachedPlan *));		owner->maxplanrefs = newmax;	}	else	{		newmax = owner->maxplanrefs * 2;		owner->planrefs = (CachedPlan **)			repalloc(owner->planrefs, newmax * sizeof(CachedPlan *));		owner->maxplanrefs = newmax;	}}/* * Remember that a plancache reference is owned by a ResourceOwner * * Caller must have previously done ResourceOwnerEnlargePlanCacheRefs() */voidResourceOwnerRememberPlanCacheRef(ResourceOwner owner, CachedPlan *plan){	Assert(owner->nplanrefs < owner->maxplanrefs);	owner->planrefs[owner->nplanrefs] = plan;	owner->nplanrefs++;}/* * Forget that a plancache reference is owned by a ResourceOwner */voidResourceOwnerForgetPlanCacheRef(ResourceOwner owner, CachedPlan *plan){	CachedPlan **planrefs = owner->planrefs;	int			np1 = owner->nplanrefs - 1;	int			i;	for (i = np1; i >= 0; i--)	{		if (planrefs[i] == plan)		{			while (i < np1)			{				planrefs[i] = planrefs[i + 1];				i++;			}			owner->nplanrefs = np1;			return;		}	}	elog(ERROR, "plancache reference %p is not owned by resource owner %s",		 plan, owner->name);}/* * Debugging subroutine */static voidPrintPlanCacheLeakWarning(CachedPlan *plan){	elog(WARNING, "plancache reference leak: plan %p not closed", plan);}/* * Make sure there is room for at least one more entry in a ResourceOwner's * tupdesc reference array. * * This is separate from actually inserting an entry because if we run out * of memory, it's critical to do so *before* acquiring the resource. */voidResourceOwnerEnlargeTupleDescs(ResourceOwner owner){	int			newmax;	if (owner->ntupdescs < owner->maxtupdescs)		return;					/* nothing to do */	if (owner->tupdescs == NULL)	{		newmax = 16;		owner->tupdescs = (TupleDesc *)			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(TupleDesc));		owner->maxtupdescs = newmax;	}	else	{		newmax = owner->maxtupdescs * 2;		owner->tupdescs = (TupleDesc *)			repalloc(owner->tupdescs, newmax * sizeof(TupleDesc));		owner->maxtupdescs = newmax;	}}/* * Remember that a tupdesc reference is owned by a ResourceOwner * * Caller must have previously done ResourceOwnerEnlargeTupleDescs() */voidResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc){	Assert(owner->ntupdescs < owner->maxtupdescs);	owner->tupdescs[owner->ntupdescs] = tupdesc;	owner->ntupdescs++;}/* * Forget that a tupdesc reference is owned by a ResourceOwner */voidResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc){	TupleDesc  *tupdescs = owner->tupdescs;	int			nt1 = owner->ntupdescs - 1;	int			i;	for (i = nt1; i >= 0; i--)	{		if (tupdescs[i] == tupdesc)		{			while (i < nt1)			{				tupdescs[i] = tupdescs[i + 1];				i++;			}			owner->ntupdescs = nt1;			return;		}	}	elog(ERROR, "tupdesc reference %p is not owned by resource owner %s",		 tupdesc, owner->name);}/* * Debugging subroutine */static voidPrintTupleDescLeakWarning(TupleDesc tupdesc){	elog(WARNING,		 "TupleDesc reference leak: TupleDesc %p (%u,%d) still referenced",		 tupdesc, tupdesc->tdtypeid, tupdesc->tdtypmod);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?