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 + -
显示快捷键?