resowner.c

来自「PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统」· C语言 代码 · 共 748 行 · 第 1/2 页

C
748
字号
	if (newparent)	{		Assert(owner != newparent);		owner->parent = newparent;		owner->nextchild = newparent->firstchild;		newparent->firstchild = owner;	}	else	{		owner->parent = NULL;		owner->nextchild = NULL;	}}/* * Register or deregister callback functions for resource cleanup * * These functions are intended for use by dynamically loaded modules. * For built-in modules we generally just hardwire the appropriate calls. * * Note that the callback occurs post-commit or post-abort, so the callback * functions can only do noncritical cleanup. */voidRegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg){	ResourceReleaseCallbackItem *item;	item = (ResourceReleaseCallbackItem *)		MemoryContextAlloc(TopMemoryContext,						   sizeof(ResourceReleaseCallbackItem));	item->callback = callback;	item->arg = arg;	item->next = ResourceRelease_callbacks;	ResourceRelease_callbacks = item;}voidUnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg){	ResourceReleaseCallbackItem *item;	ResourceReleaseCallbackItem *prev;	prev = NULL;	for (item = ResourceRelease_callbacks; item; prev = item, item = item->next)	{		if (item->callback == callback && item->arg == arg)		{			if (prev)				prev->next = item->next;			else				ResourceRelease_callbacks = item->next;			pfree(item);			break;		}	}}/* * Make sure there is room for at least one more entry in a ResourceOwner's * buffer 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. * * We allow the case owner == NULL because the bufmgr is sometimes invoked * 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));}

⌨️ 快捷键说明

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