count-pallocs.patch
application/octet-stream
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/common/reloptions.c | 2 | 1 |
| src/backend/access/gist/gistbuildbuffers.c | 4 | 2 |
| src/backend/access/gist/gistbuild.c | 6 | 3 |
| src/backend/access/hash/hashscan.c | 2 | 1 |
| src/backend/access/nbtree/nbtpage.c | 2 | 1 |
| src/backend/access/spgist/spgutils.c | 1 | 1 |
| src/backend/access/transam/multixact.c | 1 | 1 |
| src/backend/access/transam/xact.c | 8 | 4 |
| src/backend/catalog/storage.c | 4 | 2 |
| src/backend/commands/tablespace.c | 2 | 1 |
| src/backend/commands/trigger.c | 6 | 4 |
| src/backend/executor/execGrouping.c | 2 | 1 |
| src/backend/executor/execTuples.c | 4 | 2 |
| src/backend/executor/execUtils.c | 1 | 1 |
| src/backend/executor/nodeHash.c | 8 | 5 |
| src/backend/executor/nodeWindowAgg.c | 2 | 1 |
| src/backend/executor/spi.c | 2 | 1 |
| src/backend/executor/tstoreReceiver.c | 4 | 2 |
| src/backend/libpq/be-fsstubs.c | 2 | 1 |
| src/backend/libpq/be-secure.c | 2 | 1 |
| src/backend/libpq/pqcomm.c | 2 | 1 |
| src/backend/nodes/bitmapset.c | 11 | 9 |
| src/backend/nodes/list.c | 41 | 34 |
| src/backend/nodes/makefuncs.c | 14 | 10 |
| src/backend/nodes/tidbitmap.c | 4 | 2 |
| src/backend/nodes/value.c | 2 | 2 |
| src/backend/optimizer/plan/createplan.c | 3 | 4 |
| src/backend/optimizer/util/plancat.c | 3 | 5 |
| src/backend/parser/parse_relation.c | 2 | 1 |
| src/backend/postmaster/pgstat.c | 10 | 6 |
| src/backend/postmaster/postmaster.c | 2 | 1 |
| src/backend/storage/buffer/localbuf.c | 2 | 1 |
| src/backend/storage/ipc/ipc.c | 3 | 0 |
| src/backend/storage/large_object/inv_api.c | 2 | 1 |
| src/backend/storage/lmgr/lock.c | 4 | 2 |
| src/backend/storage/smgr/md.c | 2 | 1 |
| src/backend/tcop/pquery.c | 1 | 1 |
| src/backend/tsearch/spell.c | 2 | 2 |
| src/backend/utils/adt/arrayfuncs.c | 10 | 5 |
| src/backend/utils/adt/array_typanalyze.c | 2 | 1 |
| src/backend/utils/adt/array_userfuncs.c | 4 | 2 |
| src/backend/utils/adt/domains.c | 6 | 3 |
| src/backend/utils/adt/pgstatfuncs.c | 1 | 1 |
| src/backend/utils/adt/rangetypes.c | 2 | 1 |
| src/backend/utils/adt/rowtypes.c | 12 | 6 |
| src/backend/utils/adt/tsvector_op.c | 6 | 3 |
| src/backend/utils/adt/txid.c | 2 | 1 |
| src/backend/utils/adt/varlena.c | 4 | 2 |
| src/backend/utils/cache/attoptcache.c | 2 | 1 |
| src/backend/utils/cache/inval.c | 8 | 4 |
| src/backend/utils/cache/relcache.c | 43 | 23 |
| src/backend/utils/cache/spccache.c | 2 | 1 |
| src/backend/utils/cache/ts_cache.c | 5 | 3 |
| src/backend/utils/fmgr/fmgr.c | 5 | 3 |
| src/backend/utils/fmgr/funcapi.c | 1 | 1 |
| src/backend/utils/hash/dynahash.c | 1 | 1 |
| src/backend/utils/mb/mbutils.c | 2 | 1 |
| src/backend/utils/misc/guc.c | 2 | 1 |
| src/backend/utils/mmgr/aset.c | 91 | 9 |
| src/backend/utils/mmgr/mcxt.c | 14 | 13 |
| src/backend/utils/mmgr/portalmem.c | 2 | 1 |
| src/backend/utils/resowner/resowner.c | 20 | 10 |
| src/backend/utils/sort/sortsupport.c | 2 | 1 |
| src/backend/utils/time/combocid.c | 2 | 1 |
| src/backend/utils/time/snapmgr.c | 5 | 2 |
| src/include/nodes/bitmapset.h | 13 | 4 |
| src/include/nodes/makefuncs.h | 16 | 6 |
| src/include/nodes/memnodes.h | 2 | 2 |
| src/include/nodes/nodes.h | 6 | 5 |
| src/include/nodes/pg_list.h | 37 | 12 |
| src/include/nodes/value.h | 3 | 1 |
| src/include/utils/memutils.h | 13 | 4 |
| src/include/utils/palloc.h | 20 | 9 |
| src/pl/plpgsql/src/pl_comp.c | 4 | 2 |
| src/pl/plpgsql/src/pl_exec.c | 2 | 1 |
| src/pl/plpython/plpy_util.c | 1 | 1 |
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 607a80d..ca357e3 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -288,7 +288,8 @@ initialize_reloptions(void)
if (relOpts)
pfree(relOpts);
relOpts = MemoryContextAlloc(TopMemoryContext,
- (j + 1) * sizeof(relopt_gen *));
+ (j + 1) * sizeof(relopt_gen *),
+ FileAndLineTag());
j = 0;
for (i = 0; boolRelOpts[i].gen.name; i++)
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index 988896d..494d980 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -595,7 +595,8 @@ gistProcessItup(GISTBuildState *buildstate, IndexTuple itup,
/* Create new path item representing current page */
parent = path;
path = (GISTBufferingInsertStack *) MemoryContextAlloc(gfbb->context,
- sizeof(GISTBufferingInsertStack));
+ sizeof(GISTBufferingInsertStack),
+ FileAndLineTag());
path->parent = parent;
path->level = parent->level - 1;
path->blkno = childblkno;
@@ -684,7 +685,8 @@ gistbufferinginserttuples(GISTBuildState *buildstate, Buffer buffer,
BlockNumber leftmostchild;
gfbb->rootitem = (GISTBufferingInsertStack *) MemoryContextAlloc(
- gfbb->context, sizeof(GISTBufferingInsertStack));
+ gfbb->context, sizeof(GISTBufferingInsertStack),
+ FileAndLineTag());
gfbb->rootitem->parent = NULL;
gfbb->rootitem->blkno = GIST_ROOT_BLKNO;
gfbb->rootitem->downlinkoffnum = InvalidOffsetNumber;
@@ -828,7 +830,8 @@ gistBufferingFindCorrectParent(GISTBuildState *buildstate,
if (!copied)
{
parent = (GISTBufferingInsertStack *) MemoryContextAlloc(gfbb->context,
- sizeof(GISTBufferingInsertStack));
+ sizeof(GISTBufferingInsertStack),
+ FileAndLineTag());
memcpy(parent, child->parent, sizeof(GISTBufferingInsertStack));
if (parent->parent)
parent->parent->refCount++;
diff --git a/src/backend/access/gist/gistbuildbuffers.c b/src/backend/access/gist/gistbuildbuffers.c
index 34a12bc..fc0c52f 100644
--- a/src/backend/access/gist/gistbuildbuffers.c
+++ b/src/backend/access/gist/gistbuildbuffers.c
@@ -111,7 +111,8 @@ gistInitBuildBuffers(int pagesPerBuffer, int levelStep, int maxLevel)
* Root path item of the tree. Updated on each root node split.
*/
gfbb->rootitem = (GISTBufferingInsertStack *) MemoryContextAlloc(
- gfbb->context, sizeof(GISTBufferingInsertStack));
+ gfbb->context, sizeof(GISTBufferingInsertStack),
+ FileAndLineTag());
gfbb->rootitem->parent = NULL;
gfbb->rootitem->blkno = GIST_ROOT_BLKNO;
gfbb->rootitem->downlinkoffnum = InvalidOffsetNumber;
@@ -235,7 +236,8 @@ gistAllocateNewPageBuffer(GISTBuildBuffers *gfbb)
GISTNodeBufferPage *pageBuffer;
pageBuffer = (GISTNodeBufferPage *) MemoryContextAlloc(gfbb->context,
- BLCKSZ);
+ BLCKSZ,
+ FileAndLineTag());
pageBuffer->prev = InvalidBlockNumber;
/* Set page free space */
diff --git a/src/backend/access/hash/hashscan.c b/src/backend/access/hash/hashscan.c
index 0f34a3d..8ea6555 100644
--- a/src/backend/access/hash/hashscan.c
+++ b/src/backend/access/hash/hashscan.c
@@ -95,7 +95,8 @@ _hash_regscan(IndexScanDesc scan)
HashScanList new_el;
new_el = (HashScanList) MemoryContextAlloc(TopMemoryContext,
- sizeof(HashScanListData));
+ sizeof(HashScanListData),
+ FileAndLineTag());
new_el->hashsl_scan = scan;
new_el->hashsl_owner = CurrentResourceOwner;
new_el->hashsl_next = HashScans;
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index c5e147f..18af76a 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -275,7 +275,8 @@ _bt_getroot(Relation rel, int access)
* Cache the metapage data for next time
*/
rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt,
- sizeof(BTMetaPageData));
+ sizeof(BTMetaPageData),
+ FileAndLineTag());
memcpy(rel->rd_amcache, metad, sizeof(BTMetaPageData));
/*
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 46a10f6..a39548d 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -52,7 +52,7 @@ spgGetCache(Relation index)
SpGistMetaPageData *metadata;
cache = MemoryContextAllocZero(index->rd_indexcxt,
- sizeof(SpGistCache));
+ sizeof(SpGistCache), FileAndLineTag());
/* SPGiST doesn't support multi-column indexes */
Assert(index->rd_att->natts == 1);
diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c
index 8bdf387..2507ce9 100644
--- a/src/backend/access/transam/multixact.c
+++ b/src/backend/access/transam/multixact.c
@@ -1207,7 +1207,7 @@ mXactCachePut(MultiXactId multi, int nxids, TransactionId *xids)
entry = (mXactCacheEnt *)
MemoryContextAlloc(MXactContext,
offsetof(mXactCacheEnt, xids) +
- nxids * sizeof(TransactionId));
+ nxids * sizeof(TransactionId), FileAndLineTag());
entry->multi = multi;
entry->nxids = nxids;
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c71a10e..d35f5bc 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -1328,7 +1328,8 @@ AtSubCommit_childXids(void)
if (s->parent->childXids == NULL)
new_childXids =
MemoryContextAlloc(TopTransactionContext,
- new_maxChildXids * sizeof(TransactionId));
+ new_maxChildXids * sizeof(TransactionId),
+ FileAndLineTag());
else
new_childXids = repalloc(s->parent->childXids,
new_maxChildXids * sizeof(TransactionId));
@@ -3034,7 +3035,8 @@ RegisterXactCallback(XactCallback callback, void *arg)
XactCallbackItem *item;
item = (XactCallbackItem *)
- MemoryContextAlloc(TopMemoryContext, sizeof(XactCallbackItem));
+ MemoryContextAlloc(TopMemoryContext, sizeof(XactCallbackItem),
+ FileAndLineTag());
item->callback = callback;
item->arg = arg;
item->next = Xact_callbacks;
@@ -3089,7 +3091,8 @@ RegisterSubXactCallback(SubXactCallback callback, void *arg)
SubXactCallbackItem *item;
item = (SubXactCallbackItem *)
- MemoryContextAlloc(TopMemoryContext, sizeof(SubXactCallbackItem));
+ MemoryContextAlloc(TopMemoryContext, sizeof(SubXactCallbackItem),
+ FileAndLineTag());
item->callback = callback;
item->arg = arg;
item->next = SubXact_callbacks;
@@ -4298,7 +4301,8 @@ PushTransaction(void)
*/
s = (TransactionState)
MemoryContextAllocZero(TopTransactionContext,
- sizeof(TransactionStateData));
+ sizeof(TransactionStateData),
+ FileAndLineTag());
/*
* Assign a subtransaction ID, watching out for counter wraparound.
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index a017101..d17e66e 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -130,7 +130,8 @@ RelationCreateStorage(RelFileNode rnode, char relpersistence)
/* Add the relation to the list of stuff to delete at abort */
pending = (PendingRelDelete *)
- MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete));
+ MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete),
+ FileAndLineTag());
pending->relnode = rnode;
pending->backend = backend;
pending->atCommit = false; /* delete if abort */
@@ -173,7 +174,8 @@ RelationDropStorage(Relation rel)
/* Add the relation to the list of stuff to delete at commit */
pending = (PendingRelDelete *)
- MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete));
+ MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete),
+ FileAndLineTag());
pending->relnode = rel->rd_node;
pending->backend = rel->rd_backend;
pending->atCommit = true; /* delete if commit */
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index 708bebb..12afd94 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -1324,7 +1324,8 @@ PrepareTempTablespaces(void)
/* Store tablespace OIDs in an array in TopTransactionContext */
tblSpcs = (Oid *) MemoryContextAlloc(TopTransactionContext,
- list_length(namelist) * sizeof(Oid));
+ list_length(namelist) * sizeof(Oid),
+ FileAndLineTag());
numSpcs = 0;
foreach(l, namelist)
{
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 1218d03..97482d0 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3171,7 +3171,8 @@ afterTriggerAddEvent(AfterTriggerEventList *events,
chunksize /= 2; /* too many shared records */
chunksize = Min(chunksize, MAX_CHUNK_SIZE);
}
- chunk = MemoryContextAlloc(afterTriggers->event_cxt, chunksize);
+ chunk = MemoryContextAlloc(afterTriggers->event_cxt, chunksize,
+ FileAndLineTag());
chunk->next = NULL;
chunk->freeptr = CHUNK_DATA_START(chunk);
chunk->endptr = chunk->endfree = (char *) chunk + chunksize;
@@ -3635,7 +3636,7 @@ AfterTriggerBeginXact(void)
*/
afterTriggers = (AfterTriggers)
MemoryContextAlloc(TopTransactionContext,
- sizeof(AfterTriggersData));
+ sizeof(AfterTriggersData), FileAndLineTag());
afterTriggers->firing_counter = (CommandId) 1; /* mustn't be 0 */
afterTriggers->state = SetConstraintStateCreate(8);
@@ -3647,7 +3648,7 @@ AfterTriggerBeginXact(void)
/* We initialize the query stack to a reasonable size */
afterTriggers->query_stack = (AfterTriggerEventList *)
MemoryContextAlloc(TopTransactionContext,
- 8 * sizeof(AfterTriggerEventList));
+ 8 * sizeof(AfterTriggerEventList), FileAndLineTag());
afterTriggers->maxquerydepth = 8;
/* Context for events is created only when needed */
@@ -4050,7 +4051,8 @@ SetConstraintStateCreate(int numalloc)
state = (SetConstraintState)
MemoryContextAllocZero(TopTransactionContext,
sizeof(SetConstraintStateData) +
- (numalloc - 1) *sizeof(SetConstraintTriggerData));
+ (numalloc - 1) *sizeof(SetConstraintTriggerData),
+ FileAndLineTag());
state->numalloc = numalloc;
diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c
index bd7973e..096eb85 100644
--- a/src/backend/executor/execGrouping.c
+++ b/src/backend/executor/execGrouping.c
@@ -288,7 +288,8 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,
nbuckets = Min(nbuckets, (long) ((work_mem * 1024L) / entrysize));
hashtable = (TupleHashTable) MemoryContextAlloc(tablecxt,
- sizeof(TupleHashTableData));
+ sizeof(TupleHashTableData),
+ FileAndLineTag());
hashtable->numCols = numCols;
hashtable->keyColIdx = keyColIdx;
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index e755e7c..81fc248 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -281,9 +281,11 @@ ExecSetSlotDescriptor(TupleTableSlot *slot, /* slot to change */
* the same lifetime as the slot, so allocate in the slot's own context.
*/
slot->tts_values = (Datum *)
- MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(Datum));
+ MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(Datum),
+ FileAndLineTag());
slot->tts_isnull = (bool *)
- MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(bool));
+ MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(bool),
+ FileAndLineTag());
}
/* --------------------------------
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 40cd5ce..7eb41b4 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -1404,7 +1404,7 @@ RegisterExprContextCallback(ExprContext *econtext,
/* Save the info in appropriate memory context */
ecxt_callback = (ExprContext_CB *)
MemoryContextAlloc(econtext->ecxt_per_query_memory,
- sizeof(ExprContext_CB));
+ sizeof(ExprContext_CB), FileAndLineTag());
ecxt_callback->function = function;
ecxt_callback->arg = arg;
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index cabe663..7455276 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -715,7 +715,8 @@ ExecHashTableInsert(HashJoinTable hashtable,
/* Create the HashJoinTuple */
hashTupleSize = HJTUPLE_OVERHEAD + tuple->t_len;
hashTuple = (HashJoinTuple) MemoryContextAlloc(hashtable->batchCxt,
- hashTupleSize);
+ hashTupleSize,
+ FileAndLineTag());
hashTuple->hashvalue = hashvalue;
memcpy(HJTUPLE_MINTUPLE(hashTuple), tuple, tuple->t_len);
@@ -1200,10 +1201,11 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse)
*/
hashtable->skewBucket = (HashSkewBucket **)
MemoryContextAllocZero(hashtable->batchCxt,
- nbuckets * sizeof(HashSkewBucket *));
+ nbuckets * sizeof(HashSkewBucket *),
+ FileAndLineTag());
hashtable->skewBucketNums = (int *)
MemoryContextAllocZero(hashtable->batchCxt,
- mcvsToUse * sizeof(int));
+ mcvsToUse * sizeof(int), FileAndLineTag());
hashtable->spaceUsed += nbuckets * sizeof(HashSkewBucket *)
+ mcvsToUse * sizeof(int);
@@ -1252,7 +1254,7 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse)
/* Okay, create a new skew bucket for this hashvalue. */
hashtable->skewBucket[bucket] = (HashSkewBucket *)
MemoryContextAlloc(hashtable->batchCxt,
- sizeof(HashSkewBucket));
+ sizeof(HashSkewBucket), FileAndLineTag());
hashtable->skewBucket[bucket]->hashvalue = hashvalue;
hashtable->skewBucket[bucket]->tuples = NULL;
hashtable->skewBucketNums[hashtable->nSkewBuckets] = bucket;
@@ -1336,7 +1338,8 @@ ExecHashSkewTableInsert(HashJoinTable hashtable,
/* Create the HashJoinTuple */
hashTupleSize = HJTUPLE_OVERHEAD + tuple->t_len;
hashTuple = (HashJoinTuple) MemoryContextAlloc(hashtable->batchCxt,
- hashTupleSize);
+ hashTupleSize,
+ FileAndLineTag());
hashTuple->hashvalue = hashvalue;
memcpy(HJTUPLE_MINTUPLE(hashTuple), tuple, tuple->t_len);
HeapTupleHeaderClearMatch(HJTUPLE_MINTUPLE(hashTuple));
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index ce89ff2..8073fd7 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1980,7 +1980,8 @@ WinGetPartitionLocalMemory(WindowObject winobj, Size sz)
Assert(WindowObjectIsValid(winobj));
if (winobj->localmem == NULL)
winobj->localmem =
- MemoryContextAllocZero(winobj->winstate->partcontext, sz);
+ MemoryContextAllocZero(winobj->winstate->partcontext, sz,
+ FileAndLineTag());
return winobj->localmem;
}
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 5e4ae42..5f402d9 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -97,7 +97,8 @@ SPI_connect(void)
newdepth = 16;
_SPI_stack = (_SPI_connection *)
MemoryContextAlloc(TopTransactionContext,
- newdepth * sizeof(_SPI_connection));
+ newdepth * sizeof(_SPI_connection),
+ FileAndLineTag());
_SPI_stack_depth = newdepth;
}
else
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index c98ff2b..8acdd55 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -74,9 +74,11 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
myState->pub.receiveSlot = tstoreReceiveSlot_detoast;
/* Create workspace */
myState->outvalues = (Datum *)
- MemoryContextAlloc(myState->cxt, natts * sizeof(Datum));
+ MemoryContextAlloc(myState->cxt, natts * sizeof(Datum),
+ FileAndLineTag());
myState->tofree = (Datum *)
- MemoryContextAlloc(myState->cxt, natts * sizeof(Datum));
+ MemoryContextAlloc(myState->cxt, natts * sizeof(Datum),
+ FileAndLineTag());
}
else
{
diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c
index 6f7e474..de07a27 100644
--- a/src/backend/libpq/be-fsstubs.c
+++ b/src/backend/libpq/be-fsstubs.c
@@ -635,7 +635,8 @@ newLOfd(LargeObjectDesc *lobjCookie)
i = 0;
newsize = 64;
cookies = (LargeObjectDesc **)
- MemoryContextAllocZero(fscxt, newsize * sizeof(LargeObjectDesc *));
+ MemoryContextAllocZero(fscxt, newsize * sizeof(LargeObjectDesc *),
+ FileAndLineTag());
cookies_size = newsize;
}
else
diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c
index dce0eaa..bc5fcbb 100644
--- a/src/backend/libpq/be-secure.c
+++ b/src/backend/libpq/be-secure.c
@@ -961,7 +961,8 @@ aloop:
{
char *peer_cn;
- peer_cn = MemoryContextAlloc(TopMemoryContext, len + 1);
+ peer_cn = MemoryContextAlloc(TopMemoryContext, len + 1,
+ FileAndLineTag());
r = X509_NAME_get_text_by_NID(X509_get_subject_name(port->peer),
NID_commonName, peer_cn, len + 1);
peer_cn[len] = '\0';
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 2082e3d..731391d 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -153,7 +153,8 @@ void
pq_init(void)
{
PqSendBufferSize = PQ_SEND_BUFFER_SIZE;
- PqSendBuffer = MemoryContextAlloc(TopMemoryContext, PqSendBufferSize);
+ PqSendBuffer = MemoryContextAlloc(TopMemoryContext, PqSendBufferSize,
+ FileAndLineTag());
PqSendPointer = PqSendStart = PqRecvPointer = PqRecvLength = 0;
PqCommBusy = false;
DoingCopyOut = false;
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c
index 4c904e0..68f65fc 100644
--- a/src/backend/nodes/bitmapset.c
+++ b/src/backend/nodes/bitmapset.c
@@ -107,7 +107,7 @@ static const uint8 number_of_ones[256] = {
* bms_copy - make a palloc'd copy of a bitmapset
*/
Bitmapset *
-bms_copy(const Bitmapset *a)
+bms_copy_really(const Bitmapset *a, const char *tag)
{
Bitmapset *result;
size_t size;
@@ -115,7 +115,7 @@ bms_copy(const Bitmapset *a)
if (a == NULL)
return NULL;
size = BITMAPSET_SIZE(a->nwords);
- result = (Bitmapset *) palloc(size);
+ result = (Bitmapset *) MemoryContextAlloc(CurrentMemoryContext, size, tag);
memcpy(result, a, size);
return result;
}
@@ -175,7 +175,7 @@ bms_equal(const Bitmapset *a, const Bitmapset *b)
* bms_make_singleton - build a bitmapset containing a single member
*/
Bitmapset *
-bms_make_singleton(int x)
+bms_make_singleton_really(int x, const char *tag)
{
Bitmapset *result;
int wordnum,
@@ -185,7 +185,9 @@ bms_make_singleton(int x)
elog(ERROR, "negative bitmapset member not allowed");
wordnum = WORDNUM(x);
bitnum = BITNUM(x);
- result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1));
+ result = (Bitmapset *) MemoryContextAllocZero(CurrentMemoryContext,
+ BITMAPSET_SIZE(wordnum + 1),
+ tag);
result->nwords = wordnum + 1;
result->words[wordnum] = ((bitmapword) 1 << bitnum);
return result;
@@ -621,7 +623,7 @@ bms_is_empty(const Bitmapset *a)
* Input set is modified or recycled!
*/
Bitmapset *
-bms_add_member(Bitmapset *a, int x)
+bms_add_member_really(Bitmapset *a, int x, const char *tag)
{
int wordnum,
bitnum;
@@ -629,7 +631,7 @@ bms_add_member(Bitmapset *a, int x)
if (x < 0)
elog(ERROR, "negative bitmapset member not allowed");
if (a == NULL)
- return bms_make_singleton(x);
+ return bms_make_singleton_really(x, tag);
wordnum = WORDNUM(x);
bitnum = BITNUM(x);
if (wordnum >= a->nwords)
@@ -679,7 +681,7 @@ bms_del_member(Bitmapset *a, int x)
* bms_add_members - like bms_union, but left input is recycled
*/
Bitmapset *
-bms_add_members(Bitmapset *a, const Bitmapset *b)
+bms_add_members_really(Bitmapset *a, const Bitmapset *b, const char *tag)
{
Bitmapset *result;
const Bitmapset *other;
@@ -688,13 +690,13 @@ bms_add_members(Bitmapset *a, const Bitmapset *b)
/* Handle cases where either input is NULL */
if (a == NULL)
- return bms_copy(b);
+ return bms_copy_really(b, tag);
if (b == NULL)
return a;
/* Identify shorter and longer input; copy the longer one if needed */
if (a->nwords < b->nwords)
{
- result = bms_copy(b);
+ result = bms_copy_really(b, tag);
other = a;
}
else
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index 209b722..3c9f94d 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -60,16 +60,18 @@ check_list_invariants(const List *list)
* the caller should be sure to fill in that cell's data.
*/
static List *
-new_list(NodeTag type)
+new_list(NodeTag type, const char *tag)
{
List *new_list;
ListCell *new_head;
- new_head = (ListCell *) palloc(sizeof(*new_head));
+ new_head = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+ sizeof(*new_head), tag);
new_head->next = NULL;
/* new_head->data is left undefined! */
- new_list = (List *) palloc(sizeof(*new_list));
+ new_list = (List *) MemoryContextAlloc(CurrentMemoryContext,
+ sizeof(*new_list), tag);
new_list->type = type;
new_list->length = 1;
new_list->head = new_head;
@@ -105,11 +107,12 @@ new_head_cell(List *list)
* sure to fill it in
*/
static void
-new_tail_cell(List *list)
+new_tail_cell(List *list, const char *tag)
{
ListCell *new_tail;
- new_tail = (ListCell *) palloc(sizeof(*new_tail));
+ new_tail = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+ sizeof(*new_tail), tag);
new_tail->next = NULL;
list->tail->next = new_tail;
@@ -125,14 +128,14 @@ new_tail_cell(List *list)
* first argument.
*/
List *
-lappend(List *list, void *datum)
+lappend_really(List *list, void *datum, const char *tag)
{
Assert(IsPointerList(list));
if (list == NIL)
- list = new_list(T_List);
+ list = new_list(T_List, tag);
else
- new_tail_cell(list);
+ new_tail_cell(list, tag);
lfirst(list->tail) = datum;
check_list_invariants(list);
@@ -143,14 +146,14 @@ lappend(List *list, void *datum)
* Append an integer to the specified list. See lappend()
*/
List *
-lappend_int(List *list, int datum)
+lappend_int_really(List *list, int datum, const char *tag)
{
Assert(IsIntegerList(list));
if (list == NIL)
- list = new_list(T_IntList);
+ list = new_list(T_IntList, tag);
else
- new_tail_cell(list);
+ new_tail_cell(list, tag);
lfirst_int(list->tail) = datum;
check_list_invariants(list);
@@ -161,14 +164,14 @@ lappend_int(List *list, int datum)
* Append an OID to the specified list. See lappend()
*/
List *
-lappend_oid(List *list, Oid datum)
+lappend_oid_really(List *list, Oid datum, const char *tag)
{
Assert(IsOidList(list));
if (list == NIL)
- list = new_list(T_OidList);
+ list = new_list(T_OidList, tag);
else
- new_tail_cell(list);
+ new_tail_cell(list, tag);
lfirst_oid(list->tail) = datum;
check_list_invariants(list);
@@ -256,12 +259,12 @@ lappend_cell_oid(List *list, ListCell *prev, Oid datum)
* the case.
*/
List *
-lcons(void *datum, List *list)
+lcons_really(void *datum, List *list, const char *tag)
{
Assert(IsPointerList(list));
if (list == NIL)
- list = new_list(T_List);
+ list = new_list(T_List, tag);
else
new_head_cell(list);
@@ -274,12 +277,12 @@ lcons(void *datum, List *list)
* Prepend an integer to the list. See lcons()
*/
List *
-lcons_int(int datum, List *list)
+lcons_int_really(int datum, List *list, const char *tag)
{
Assert(IsIntegerList(list));
if (list == NIL)
- list = new_list(T_IntList);
+ list = new_list(T_IntList, tag);
else
new_head_cell(list);
@@ -292,12 +295,12 @@ lcons_int(int datum, List *list)
* Prepend an OID to the list. See lcons()
*/
List *
-lcons_oid(Oid datum, List *list)
+lcons_oid_really(Oid datum, List *list, const char *tag)
{
Assert(IsOidList(list));
if (list == NIL)
- list = new_list(T_OidList);
+ list = new_list(T_OidList, tag);
else
new_head_cell(list);
@@ -933,12 +936,12 @@ list_difference_oid(const List *list1, const List *list2)
* via equal().
*/
List *
-list_append_unique(List *list, void *datum)
+list_append_unique_really(List *list, void *datum, const char *tag)
{
if (list_member(list, datum))
return list;
else
- return lappend(list, datum);
+ return lappend_really(list, datum, tag);
}
/*
@@ -946,36 +949,36 @@ list_append_unique(List *list, void *datum)
* simple pointer equality.
*/
List *
-list_append_unique_ptr(List *list, void *datum)
+list_append_unique_ptr_really(List *list, void *datum, const char *tag)
{
if (list_member_ptr(list, datum))
return list;
else
- return lappend(list, datum);
+ return lappend_really(list, datum, tag);
}
/*
* This variant of list_append_unique() operates upon lists of integers.
*/
List *
-list_append_unique_int(List *list, int datum)
+list_append_unique_int_really(List *list, int datum, const char *tag)
{
if (list_member_int(list, datum))
return list;
else
- return lappend_int(list, datum);
+ return lappend_int_really(list, datum, tag);
}
/*
* This variant of list_append_unique() operates upon lists of OIDs.
*/
List *
-list_append_unique_oid(List *list, Oid datum)
+list_append_unique_oid_really(List *list, Oid datum, const char *tag)
{
if (list_member_oid(list, datum))
return list;
else
- return lappend_oid(list, datum);
+ return lappend_oid_really(list, datum, tag);
}
/*
@@ -1131,7 +1134,7 @@ list_free_deep(List *list)
* Return a shallow copy of the specified list.
*/
List *
-list_copy(const List *oldlist)
+list_copy_really(const List *oldlist, const char *tag)
{
List *newlist;
ListCell *newlist_prev;
@@ -1140,7 +1143,7 @@ list_copy(const List *oldlist)
if (oldlist == NIL)
return NIL;
- newlist = new_list(oldlist->type);
+ newlist = new_list(oldlist->type, tag);
newlist->length = oldlist->length;
/*
@@ -1155,7 +1158,9 @@ list_copy(const List *oldlist)
{
ListCell *newlist_cur;
- newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));
+ newlist_cur = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+ sizeof(*newlist_cur),
+ tag);
newlist_cur->data = oldlist_cur->data;
newlist_prev->next = newlist_cur;
@@ -1174,7 +1179,7 @@ list_copy(const List *oldlist)
* Return a shallow copy of the specified list, without the first N elements.
*/
List *
-list_copy_tail(const List *oldlist, int nskip)
+list_copy_tail_really(const List *oldlist, int nskip, const char *tag)
{
List *newlist;
ListCell *newlist_prev;
@@ -1186,7 +1191,7 @@ list_copy_tail(const List *oldlist, int nskip)
if (oldlist == NIL || nskip >= oldlist->length)
return NIL;
- newlist = new_list(oldlist->type);
+ newlist = new_list(oldlist->type, tag);
newlist->length = oldlist->length - nskip;
/*
@@ -1208,7 +1213,9 @@ list_copy_tail(const List *oldlist, int nskip)
{
ListCell *newlist_cur;
- newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));
+ newlist_cur = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+ sizeof(*newlist_cur),
+ tag);
newlist_cur->data = oldlist_cur->data;
newlist_prev->next = newlist_cur;
diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
index bb5cdae..2da407c 100644
--- a/src/backend/nodes/makefuncs.c
+++ b/src/backend/nodes/makefuncs.c
@@ -63,14 +63,15 @@ makeSimpleA_Expr(A_Expr_Kind kind, char *name,
* creates a Var node
*/
Var *
-makeVar(Index varno,
+makeVar_really(Index varno,
AttrNumber varattno,
Oid vartype,
int32 vartypmod,
Oid varcollid,
- Index varlevelsup)
+ Index varlevelsup,
+ const char *tag)
{
- Var *var = makeNode(Var);
+ Var *var = makeNodeWithTag(Var, tag);
var->varno = varno;
var->varattno = varattno;
@@ -100,15 +101,16 @@ makeVar(Index varno,
* TargetEntry
*/
Var *
-makeVarFromTargetEntry(Index varno,
- TargetEntry *tle)
+makeVarFromTargetEntry_really(Index varno,
+ TargetEntry *tle,
+ const char *tag)
{
- return makeVar(varno,
+ return makeVar_really(varno,
tle->resno,
exprType((Node *) tle->expr),
exprTypmod((Node *) tle->expr),
exprCollation((Node *) tle->expr),
- 0);
+ 0, tag);
}
/*
@@ -209,13 +211,15 @@ makeWholeRowVar(RangeTblEntry *rte,
* creates a TargetEntry node
*/
TargetEntry *
-makeTargetEntry(Expr *expr,
+makeTargetEntry_really(Expr *expr,
AttrNumber resno,
char *resname,
- bool resjunk)
+ bool resjunk,
+ const char *tag)
{
- TargetEntry *tle = makeNode(TargetEntry);
+ TargetEntry *tle;
+ tle = makeNodeWithTag(TargetEntry, tag);
tle->expr = expr;
tle->resno = resno;
tle->resname = resname;
diff --git a/src/backend/nodes/tidbitmap.c b/src/backend/nodes/tidbitmap.c
index 17dae0d..79d2e25 100644
--- a/src/backend/nodes/tidbitmap.c
+++ b/src/backend/nodes/tidbitmap.c
@@ -598,11 +598,13 @@ tbm_begin_iterate(TIDBitmap *tbm)
if (!tbm->spages && tbm->npages > 0)
tbm->spages = (PagetableEntry **)
MemoryContextAlloc(tbm->mcxt,
- tbm->npages * sizeof(PagetableEntry *));
+ tbm->npages * sizeof(PagetableEntry *),
+ FileAndLineTag());
if (!tbm->schunks && tbm->nchunks > 0)
tbm->schunks = (PagetableEntry **)
MemoryContextAlloc(tbm->mcxt,
- tbm->nchunks * sizeof(PagetableEntry *));
+ tbm->nchunks * sizeof(PagetableEntry *),
+ FileAndLineTag());
hash_seq_init(&status, tbm->pagetable);
npages = nchunks = 0;
diff --git a/src/backend/nodes/value.c b/src/backend/nodes/value.c
index 2788e0e..59bce3f 100644
--- a/src/backend/nodes/value.c
+++ b/src/backend/nodes/value.c
@@ -50,9 +50,9 @@ makeFloat(char *numericStr)
* Caller is responsible for passing a palloc'd string.
*/
Value *
-makeString(char *str)
+makeString_really(char *str, const char *tag)
{
- Value *v = makeNode(Value);
+ Value *v = makeNodeWithTag(Value, tag);
v->type = T_String;
v->val.str = str;
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index c34b9b8..c513cf3 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -428,11 +428,10 @@ build_relation_tlist(RelOptInfo *rel)
{
/* Do we really need to copy here? Not sure */
Node *node = (Node *) copyObject(lfirst(v));
+ TargetEntry *tle;
- tlist = lappend(tlist, makeTargetEntry((Expr *) node,
- resno,
- NULL,
- false));
+ tle = makeTargetEntry((Expr *) node, resno, NULL, false);
+ tlist = lappend(tlist, tle);
resno++;
}
return tlist;
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index aaf288a..bfab467 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -850,6 +850,7 @@ build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
for (attrno = 1; attrno <= numattrs; attrno++)
{
Form_pg_attribute att_tup = relation->rd_att->attrs[attrno - 1];
+ TargetEntry *tle;
if (att_tup->attisdropped)
{
@@ -865,11 +866,8 @@ build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
att_tup->attcollation,
0);
- tlist = lappend(tlist,
- makeTargetEntry((Expr *) var,
- attrno,
- NULL,
- false));
+ tle = makeTargetEntry((Expr *) var, attrno, NULL, false);
+ tlist = lappend(tlist, tle);
}
heap_close(relation, NoLock);
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 2a26b0a..475cc1c 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -746,7 +746,8 @@ buildRelationAliases(TupleDesc tupdesc, Alias *alias, Alias *eref)
}
else
{
- attrname = makeString(pstrdup(NameStr(attr->attname)));
+ char *x = pstrdup(NameStr(attr->attname));
+ attrname = makeString(x);
/* we're done with the alias if any */
}
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 424cfca..cd4b3b2 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -1629,7 +1629,8 @@ get_tabstat_entry(Oid rel_id, bool isshared)
* We ran out of tabstat slots, so allocate more. Be sure they're zeroed.
*/
tsa = (TabStatusArray *) MemoryContextAllocZero(TopMemoryContext,
- sizeof(TabStatusArray));
+ sizeof(TabStatusArray),
+ FileAndLineTag());
if (prev_tsa)
prev_tsa->tsa_next = tsa;
else
@@ -1683,7 +1684,7 @@ get_tabstat_stack_level(int nest_level)
{
xact_state = (PgStat_SubXactStatus *)
MemoryContextAlloc(TopTransactionContext,
- sizeof(PgStat_SubXactStatus));
+ sizeof(PgStat_SubXactStatus), FileAndLineTag());
xact_state->nest_level = nest_level;
xact_state->prev = pgStatXactStack;
xact_state->first = NULL;
@@ -1710,7 +1711,8 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
/* Now make a per-table stack entry */
trans = (PgStat_TableXactStatus *)
MemoryContextAllocZero(TopTransactionContext,
- sizeof(PgStat_TableXactStatus));
+ sizeof(PgStat_TableXactStatus),
+ FileAndLineTag());
trans->nest_level = nest_level;
trans->upper = pgstat_info->trans;
trans->parent = pgstat_info;
@@ -2696,13 +2698,15 @@ pgstat_read_current_status(void)
localtable = (PgBackendStatus *)
MemoryContextAlloc(pgStatLocalContext,
- sizeof(PgBackendStatus) * MaxBackends);
+ sizeof(PgBackendStatus) * MaxBackends,
+ FileAndLineTag());
localappname = (char *)
MemoryContextAlloc(pgStatLocalContext,
- NAMEDATALEN * MaxBackends);
+ NAMEDATALEN * MaxBackends, FileAndLineTag());
localactivity = (char *)
MemoryContextAlloc(pgStatLocalContext,
- pgstat_track_activity_query_size * MaxBackends);
+ pgstat_track_activity_query_size * MaxBackends,
+ FileAndLineTag());
localNumBackends = 0;
beentry = BackendStatusArray;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index dd7dd55..ffd60d7 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -3564,7 +3564,8 @@ BackendRun(Port *port)
maxac += (strlen(ExtraOptions) + 1) / 2;
av = (char **) MemoryContextAlloc(TopMemoryContext,
- maxac * sizeof(char *));
+ maxac * sizeof(char *),
+ FileAndLineTag());
ac = 0;
av[ac++] = "postgres";
diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c
index 63c14f7..939e39a 100644
--- a/src/backend/storage/buffer/localbuf.c
+++ b/src/backend/storage/buffer/localbuf.c
@@ -434,7 +434,8 @@ GetLocalBufferStorage(void)
num_bufs = Min(num_bufs, MaxAllocSize / BLCKSZ);
cur_block = (char *) MemoryContextAlloc(LocalBufferContext,
- num_bufs * BLCKSZ);
+ num_bufs * BLCKSZ,
+ FileAndLineTag());
next_buf_in_block = 0;
num_bufs_in_block = num_bufs;
}
diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c
index 067b24a..0a7159c 100644
--- a/src/backend/storage/ipc/ipc.c
+++ b/src/backend/storage/ipc/ipc.c
@@ -29,6 +29,7 @@
#endif
#include "storage/ipc.h"
#include "tcop/tcopprot.h"
+#include "utils/memutils.h"
/*
@@ -134,6 +135,8 @@ proc_exit(int code)
elog(DEBUG3, "exit(%d)", code);
+ dump_allocations();
+
exit(code);
}
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index 3adfb15..95487be 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -241,7 +241,8 @@ inv_open(Oid lobjId, int flags, MemoryContext mcxt)
LargeObjectDesc *retval;
retval = (LargeObjectDesc *) MemoryContextAlloc(mcxt,
- sizeof(LargeObjectDesc));
+ sizeof(LargeObjectDesc),
+ FileAndLineTag());
retval->id = lobjId;
retval->subid = GetCurrentSubTransactionId();
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 50b95ac..ab33268 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -652,7 +652,8 @@ LockAcquireExtended(const LOCKTAG *locktag,
locallock->lockOwners = NULL;
locallock->lockOwners = (LOCALLOCKOWNER *)
MemoryContextAlloc(TopMemoryContext,
- locallock->maxLockOwners * sizeof(LOCALLOCKOWNER));
+ locallock->maxLockOwners * sizeof(LOCALLOCKOWNER),
+ FileAndLineTag());
}
else
{
@@ -2468,7 +2469,8 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode)
if (vxids == NULL)
vxids = (VirtualTransactionId *)
MemoryContextAlloc(TopMemoryContext,
- sizeof(VirtualTransactionId) * (MaxBackends + 1));
+ sizeof(VirtualTransactionId) * (MaxBackends + 1),
+ FileAndLineTag());
}
else
vxids = (VirtualTransactionId *)
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index eeb20fd..52e58ca 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -1510,7 +1510,8 @@ ForgetDatabaseFsyncRequests(Oid dbid)
static MdfdVec *
_fdvec_alloc(void)
{
- return (MdfdVec *) MemoryContextAlloc(MdCxt, sizeof(MdfdVec));
+ return (MdfdVec *) MemoryContextAlloc(MdCxt, sizeof(MdfdVec),
+ FileAndLineTag());
}
/*
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c
index d0db7ad..1e9169e 100644
--- a/src/backend/tcop/pquery.c
+++ b/src/backend/tcop/pquery.c
@@ -652,7 +652,7 @@ PortalSetResultFormat(Portal portal, int nFormats, int16 *formats)
natts = portal->tupDesc->natts;
portal->formats = (int16 *)
MemoryContextAlloc(PortalGetHeapMemory(portal),
- natts * sizeof(int16));
+ natts * sizeof(int16), FileAndLineTag());
if (nFormats > 1)
{
/* format specified for each column */
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index 2fe40ed..ac9ce52 100644
--- a/src/backend/tsearch/spell.c
+++ b/src/backend/tsearch/spell.c
@@ -27,8 +27,8 @@
* with the dictionary cache entry. We keep the short-lived stuff
* in the Conf->buildCxt context.
*/
-#define tmpalloc(sz) MemoryContextAlloc(Conf->buildCxt, (sz))
-#define tmpalloc0(sz) MemoryContextAllocZero(Conf->buildCxt, (sz))
+#define tmpalloc(sz) MemoryContextAlloc(Conf->buildCxt, (sz), FileAndLineTag())
+#define tmpalloc0(sz) MemoryContextAllocZero(Conf->buildCxt, (sz), FileAndLineTag())
/*
* Prepare for constructing an ISpell dictionary.
diff --git a/src/backend/utils/adt/array_typanalyze.c b/src/backend/utils/adt/array_typanalyze.c
index fa79d9f..5988dcf 100644
--- a/src/backend/utils/adt/array_typanalyze.c
+++ b/src/backend/utils/adt/array_typanalyze.c
@@ -608,7 +608,8 @@ compute_array_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
*/
hist = (float4 *)
MemoryContextAlloc(stats->anl_context,
- sizeof(float4) * (num_hist + 1));
+ sizeof(float4) * (num_hist + 1),
+ FileAndLineTag());
hist[num_hist] = (double) element_no / (double) nonnull_cnt;
/*----------
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c
index a6ba0cf..b76a031 100644
--- a/src/backend/utils/adt/array_userfuncs.c
+++ b/src/backend/utils/adt/array_userfuncs.c
@@ -128,7 +128,8 @@ array_push(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
@@ -447,7 +448,8 @@ create_singleton_array(FunctionCallInfo fcinfo,
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 5582a06..764ea34 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -170,7 +170,8 @@ array_in(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
@@ -990,7 +991,8 @@ array_out(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
@@ -1288,7 +1290,8 @@ array_recv(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
@@ -1510,7 +1513,8 @@ array_send(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
@@ -4990,7 +4994,8 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs,
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = InvalidOid;
}
diff --git a/src/backend/utils/adt/domains.c b/src/backend/utils/adt/domains.c
index 591d992..fd8a44e 100644
--- a/src/backend/utils/adt/domains.c
+++ b/src/backend/utils/adt/domains.c
@@ -214,7 +214,8 @@ domain_in(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
my_extra = (DomainIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(DomainIOData));
+ sizeof(DomainIOData),
+ FileAndLineTag());
domain_state_setup(my_extra, domainType, false,
fcinfo->flinfo->fn_mcxt);
fcinfo->flinfo->fn_extra = (void *) my_extra;
@@ -274,7 +275,8 @@ domain_recv(PG_FUNCTION_ARGS)
if (my_extra == NULL)
{
my_extra = (DomainIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(DomainIOData));
+ sizeof(DomainIOData),
+ FileAndLineTag());
domain_state_setup(my_extra, domainType, true,
fcinfo->flinfo->fn_mcxt);
fcinfo->flinfo->fn_extra = (void *) my_extra;
@@ -325,7 +327,8 @@ domain_check(Datum value, bool isnull, Oid domainType, void **extra, MemoryConte
if (my_extra == NULL)
{
my_extra = (DomainIOData *) MemoryContextAlloc(mcxt,
- sizeof(DomainIOData));
+ sizeof(DomainIOData),
+ FileAndLineTag());
domain_state_setup(my_extra, domainType, true, mcxt);
if (extra)
*extra = (void *) my_extra;
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 83d0c22..4000a85 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -476,7 +476,7 @@ pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
funcctx = SRF_FIRSTCALL_INIT();
fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx,
- 2 * sizeof(int));
+ 2 * sizeof(int), FileAndLineTag());
funcctx->user_fctx = fctx;
fctx[0] = 0;
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 0994fa7..def2bad 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -305,7 +305,8 @@ get_range_io_data(FunctionCallInfo fcinfo, Oid rngtypid, IOFuncSelector func)
char typdelim;
cache = (RangeIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(RangeIOData));
+ sizeof(RangeIOData),
+ FileAndLineTag());
cache->typcache = lookup_type_cache(rngtypid, TYPECACHE_RANGE_INFO);
if (cache->typcache->rngelemtype == NULL)
elog(ERROR, "type %u is not a range type", rngtypid);
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index ba7fde4..54e514c 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -117,7 +117,8 @@ record_in(PG_FUNCTION_ARGS)
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(RecordIOData) - sizeof(ColumnIOData)
- + ncolumns * sizeof(ColumnIOData));
+ + ncolumns * sizeof(ColumnIOData),
+ FileAndLineTag());
my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
my_extra->record_type = InvalidOid;
my_extra->record_typmod = 0;
@@ -331,7 +332,8 @@ record_out(PG_FUNCTION_ARGS)
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(RecordIOData) - sizeof(ColumnIOData)
- + ncolumns * sizeof(ColumnIOData));
+ + ncolumns * sizeof(ColumnIOData),
+ FileAndLineTag());
my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
my_extra->record_type = InvalidOid;
my_extra->record_typmod = 0;
@@ -486,7 +488,8 @@ record_recv(PG_FUNCTION_ARGS)
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(RecordIOData) - sizeof(ColumnIOData)
- + ncolumns * sizeof(ColumnIOData));
+ + ncolumns * sizeof(ColumnIOData),
+ FileAndLineTag());
my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
my_extra->record_type = InvalidOid;
my_extra->record_typmod = 0;
@@ -674,7 +677,8 @@ record_send(PG_FUNCTION_ARGS)
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(RecordIOData) - sizeof(ColumnIOData)
- + ncolumns * sizeof(ColumnIOData));
+ + ncolumns * sizeof(ColumnIOData),
+ FileAndLineTag());
my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
my_extra->record_type = InvalidOid;
my_extra->record_typmod = 0;
@@ -829,7 +833,8 @@ record_cmp(FunctionCallInfo fcinfo)
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(RecordCompareData) - sizeof(ColumnCompareData)
- + ncols * sizeof(ColumnCompareData));
+ + ncols * sizeof(ColumnCompareData),
+ FileAndLineTag());
my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
my_extra->ncolumns = ncols;
my_extra->record1_type = InvalidOid;
@@ -1064,7 +1069,8 @@ record_eq(PG_FUNCTION_ARGS)
fcinfo->flinfo->fn_extra =
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
sizeof(RecordCompareData) - sizeof(ColumnCompareData)
- + ncols * sizeof(ColumnCompareData));
+ + ncols * sizeof(ColumnCompareData),
+ FileAndLineTag());
my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
my_extra->ncolumns = ncols;
my_extra->record1_type = InvalidOid;
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index bab6534..c63284b 100644
--- a/src/backend/utils/adt/tsvector_op.c
+++ b/src/backend/utils/adt/tsvector_op.c
@@ -918,7 +918,8 @@ insertStatEntry(MemoryContext persistentContext, TSVectorStat *stat, TSVector tx
if (node == NULL)
{
- node = MemoryContextAlloc(persistentContext, STATENTRYHDRSZ + we->len);
+ node = MemoryContextAlloc(persistentContext, STATENTRYHDRSZ + we->len,
+ FileAndLineTag());
node->left = node->right = NULL;
node->ndoc = 1;
node->nentry = n;
@@ -987,7 +988,8 @@ ts_accum(MemoryContext persistentContext, TSVectorStat *stat, Datum data)
if (stat == NULL)
{ /* Init in first */
- stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat));
+ stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat),
+ FileAndLineTag());
stat->maxdepth = 1;
}
@@ -1172,7 +1174,8 @@ ts_stat_sql(MemoryContext persistentContext, text *txt, text *ws)
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("ts_stat query must return one tsvector column")));
- stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat));
+ stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat),
+ FileAndLineTag());
stat->maxdepth = 1;
if (ws)
diff --git a/src/backend/utils/adt/txid.c b/src/backend/utils/adt/txid.c
index 08a8c89..699ed3d 100644
--- a/src/backend/utils/adt/txid.c
+++ b/src/backend/utils/adt/txid.c
@@ -571,7 +571,8 @@ txid_snapshot_xip(PG_FUNCTION_ARGS)
fctx = SRF_FIRSTCALL_INIT();
/* make a copy of user snapshot */
- snap = MemoryContextAlloc(fctx->multi_call_memory_ctx, VARSIZE(arg));
+ snap = MemoryContextAlloc(fctx->multi_call_memory_ctx, VARSIZE(arg),
+ FileAndLineTag());
memcpy(snap, arg, VARSIZE(arg));
fctx->user_fctx = snap;
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index a5592d5..77fd250 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -3381,7 +3381,8 @@ array_to_text_internal(FunctionCallInfo fcinfo, ArrayType *v,
if (my_extra == NULL)
{
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
+ sizeof(ArrayMetaState),
+ FileAndLineTag());
my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
my_extra->element_type = ~element_type;
}
@@ -3578,7 +3579,8 @@ pg_column_size(PG_FUNCTION_ARGS)
elog(ERROR, "cache lookup failed for type %u", argtypeid);
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(int));
+ sizeof(int),
+ FileAndLineTag());
*((int *) fcinfo->flinfo->fn_extra) = typlen;
}
else
diff --git a/src/backend/utils/cache/attoptcache.c b/src/backend/utils/cache/attoptcache.c
index e01ae21..0cdaf1f 100644
--- a/src/backend/utils/cache/attoptcache.c
+++ b/src/backend/utils/cache/attoptcache.c
@@ -153,7 +153,8 @@ get_attribute_options(Oid attrelid, int attnum)
bytea *bytea_opts = attribute_reloptions(datum, false);
opts = MemoryContextAlloc(CacheMemoryContext,
- VARSIZE(bytea_opts));
+ VARSIZE(bytea_opts),
+ FileAndLineTag());
memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
}
ReleaseSysCache(tp);
diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c
index d5fe85a..fd616d0 100644
--- a/src/backend/utils/cache/inval.c
+++ b/src/backend/utils/cache/inval.c
@@ -222,7 +222,8 @@ AddInvalidationMessage(InvalidationChunk **listHdr,
chunk = (InvalidationChunk *)
MemoryContextAlloc(CurTransactionContext,
sizeof(InvalidationChunk) +
- (FIRSTCHUNKSIZE - 1) *sizeof(SharedInvalidationMessage));
+ (FIRSTCHUNKSIZE - 1) *sizeof(SharedInvalidationMessage),
+ FileAndLineTag());
chunk->nitems = 0;
chunk->maxitems = FIRSTCHUNKSIZE;
chunk->next = *listHdr;
@@ -236,7 +237,8 @@ AddInvalidationMessage(InvalidationChunk **listHdr,
chunk = (InvalidationChunk *)
MemoryContextAlloc(CurTransactionContext,
sizeof(InvalidationChunk) +
- (chunksize - 1) *sizeof(SharedInvalidationMessage));
+ (chunksize - 1) *sizeof(SharedInvalidationMessage),
+ FileAndLineTag());
chunk->nitems = 0;
chunk->maxitems = chunksize;
chunk->next = *listHdr;
@@ -629,7 +631,8 @@ AtStart_Inval(void)
Assert(transInvalInfo == NULL);
transInvalInfo = (TransInvalidationInfo *)
MemoryContextAllocZero(TopTransactionContext,
- sizeof(TransInvalidationInfo));
+ sizeof(TransInvalidationInfo),
+ FileAndLineTag());
transInvalInfo->my_level = GetCurrentTransactionNestLevel();
SharedInvalidMessagesArray = NULL;
numSharedInvalidMessagesArray = 0;
@@ -665,7 +668,8 @@ AtSubStart_Inval(void)
Assert(transInvalInfo != NULL);
myInfo = (TransInvalidationInfo *)
MemoryContextAllocZero(TopTransactionContext,
- sizeof(TransInvalidationInfo));
+ sizeof(TransInvalidationInfo),
+ FileAndLineTag());
myInfo->parent = transInvalInfo;
myInfo->my_level = GetCurrentTransactionNestLevel();
transInvalInfo = myInfo;
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7f0e20e..f33b07e 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -399,7 +399,8 @@ RelationParseRelOptions(Relation relation, HeapTuple tuple)
if (options)
{
relation->rd_options = MemoryContextAlloc(CacheMemoryContext,
- VARSIZE(options));
+ VARSIZE(options),
+ FileAndLineTag());
memcpy(relation->rd_options, options, VARSIZE(options));
pfree(options);
}
@@ -429,7 +430,8 @@ RelationBuildTupleDesc(Relation relation)
relation->rd_att->tdhasoid = relation->rd_rel->relhasoids;
constr = (TupleConstr *) MemoryContextAlloc(CacheMemoryContext,
- sizeof(TupleConstr));
+ sizeof(TupleConstr),
+ FileAndLineTag());
constr->has_not_null = false;
/*
@@ -488,7 +490,8 @@ RelationBuildTupleDesc(Relation relation)
attrdef = (AttrDefault *)
MemoryContextAllocZero(CacheMemoryContext,
relation->rd_rel->relnatts *
- sizeof(AttrDefault));
+ sizeof(AttrDefault),
+ FileAndLineTag());
attrdef[ndef].adnum = attp->attnum;
attrdef[ndef].adbin = NULL;
ndef++;
@@ -555,7 +558,8 @@ RelationBuildTupleDesc(Relation relation)
constr->num_check = relation->rd_rel->relchecks;
constr->check = (ConstrCheck *)
MemoryContextAllocZero(CacheMemoryContext,
- constr->num_check * sizeof(ConstrCheck));
+ constr->num_check * sizeof(ConstrCheck),
+ FileAndLineTag());
CheckConstraintFetch(relation);
}
else
@@ -615,7 +619,8 @@ RelationBuildRuleLock(Relation relation)
*/
maxlocks = 4;
rules = (RewriteRule **)
- MemoryContextAlloc(rulescxt, sizeof(RewriteRule *) * maxlocks);
+ MemoryContextAlloc(rulescxt, sizeof(RewriteRule *) * maxlocks,
+ FileAndLineTag());
numlocks = 0;
/*
@@ -650,7 +655,8 @@ RelationBuildRuleLock(Relation relation)
RewriteRule *rule;
rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
- sizeof(RewriteRule));
+ sizeof(RewriteRule),
+ FileAndLineTag());
rule->ruleId = HeapTupleGetOid(rewrite_tuple);
@@ -732,7 +738,8 @@ RelationBuildRuleLock(Relation relation)
/*
* form a RuleLock and insert into relation
*/
- rulelock = (RuleLock *) MemoryContextAlloc(rulescxt, sizeof(RuleLock));
+ rulelock = (RuleLock *) MemoryContextAlloc(rulescxt, sizeof(RuleLock),
+ FileAndLineTag());
rulelock->numLocks = numlocks;
rulelock->rules = rules;
@@ -1009,7 +1016,8 @@ RelationInitIndexAccessInfo(Relation relation)
if (!HeapTupleIsValid(tuple))
elog(ERROR, "cache lookup failed for access method %u",
relation->rd_rel->relam);
- aform = (Form_pg_am) MemoryContextAlloc(CacheMemoryContext, sizeof *aform);
+ aform = (Form_pg_am) MemoryContextAlloc(CacheMemoryContext, sizeof *aform,
+ FileAndLineTag());
memcpy(aform, GETSTRUCT(tuple), sizeof *aform);
ReleaseSysCache(tuple);
relation->rd_am = aform;
@@ -1039,21 +1047,24 @@ RelationInitIndexAccessInfo(Relation relation)
* Allocate arrays to hold data
*/
relation->rd_aminfo = (RelationAmInfo *)
- MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo));
+ MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo),
+ FileAndLineTag());
relation->rd_opfamily = (Oid *)
- MemoryContextAllocZero(indexcxt, natts * sizeof(Oid));
+ MemoryContextAllocZero(indexcxt, natts * sizeof(Oid), FileAndLineTag());
relation->rd_opcintype = (Oid *)
- MemoryContextAllocZero(indexcxt, natts * sizeof(Oid));
+ MemoryContextAllocZero(indexcxt, natts * sizeof(Oid), FileAndLineTag());
if (amsupport > 0)
{
int nsupport = natts * amsupport;
relation->rd_support = (RegProcedure *)
- MemoryContextAllocZero(indexcxt, nsupport * sizeof(RegProcedure));
+ MemoryContextAllocZero(indexcxt, nsupport * sizeof(RegProcedure),
+ FileAndLineTag());
relation->rd_supportinfo = (FmgrInfo *)
- MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo));
+ MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo),
+ FileAndLineTag());
}
else
{
@@ -1062,10 +1073,11 @@ RelationInitIndexAccessInfo(Relation relation)
}
relation->rd_indcollation = (Oid *)
- MemoryContextAllocZero(indexcxt, natts * sizeof(Oid));
+ MemoryContextAllocZero(indexcxt, natts * sizeof(Oid), FileAndLineTag());
relation->rd_indoption = (int16 *)
- MemoryContextAllocZero(indexcxt, natts * sizeof(int16));
+ MemoryContextAllocZero(indexcxt, natts * sizeof(int16),
+ FileAndLineTag());
/*
* indcollation cannot be referenced directly through the C struct,
@@ -1229,7 +1241,8 @@ LookupOpclassInfo(Oid operatorClassOid,
if (numSupport > 0)
opcentry->supportProcs = (RegProcedure *)
MemoryContextAllocZero(CacheMemoryContext,
- numSupport * sizeof(RegProcedure));
+ numSupport * sizeof(RegProcedure),
+ FileAndLineTag());
else
opcentry->supportProcs = NULL;
}
@@ -4091,7 +4104,8 @@ load_relcache_init_file(bool shared)
if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
goto read_failed;
- opfamily = (Oid *) MemoryContextAlloc(indexcxt, len);
+ opfamily = (Oid *) MemoryContextAlloc(indexcxt, len,
+ FileAndLineTag());
if (fread(opfamily, 1, len, fp) != len)
goto read_failed;
@@ -4101,7 +4115,8 @@ load_relcache_init_file(bool shared)
if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
goto read_failed;
- opcintype = (Oid *) MemoryContextAlloc(indexcxt, len);
+ opcintype = (Oid *) MemoryContextAlloc(indexcxt, len,
+ FileAndLineTag());
if (fread(opcintype, 1, len, fp) != len)
goto read_failed;
@@ -4110,7 +4125,8 @@ load_relcache_init_file(bool shared)
/* next, read the vector of support procedure OIDs */
if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
goto read_failed;
- support = (RegProcedure *) MemoryContextAlloc(indexcxt, len);
+ support = (RegProcedure *) MemoryContextAlloc(indexcxt, len,
+ FileAndLineTag());
if (fread(support, 1, len, fp) != len)
goto read_failed;
@@ -4120,7 +4136,8 @@ load_relcache_init_file(bool shared)
if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
goto read_failed;
- indcollation = (Oid *) MemoryContextAlloc(indexcxt, len);
+ indcollation = (Oid *) MemoryContextAlloc(indexcxt, len,
+ FileAndLineTag());
if (fread(indcollation, 1, len, fp) != len)
goto read_failed;
@@ -4130,7 +4147,8 @@ load_relcache_init_file(bool shared)
if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
goto read_failed;
- indoption = (int16 *) MemoryContextAlloc(indexcxt, len);
+ indoption = (int16 *) MemoryContextAlloc(indexcxt, len,
+ FileAndLineTag());
if (fread(indoption, 1, len, fp) != len)
goto read_failed;
@@ -4138,10 +4156,12 @@ load_relcache_init_file(bool shared)
/* set up zeroed fmgr-info vectors */
rel->rd_aminfo = (RelationAmInfo *)
- MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo));
+ MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo),
+ FileAndLineTag());
nsupport = relform->relnatts * am->amsupport;
rel->rd_supportinfo = (FmgrInfo *)
- MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo));
+ MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo),
+ FileAndLineTag());
}
else
{
diff --git a/src/backend/utils/cache/spccache.c b/src/backend/utils/cache/spccache.c
index cf18ee1..20285ce 100644
--- a/src/backend/utils/cache/spccache.c
+++ b/src/backend/utils/cache/spccache.c
@@ -150,7 +150,8 @@ get_tablespace(Oid spcid)
{
bytea *bytea_opts = tablespace_reloptions(datum, false);
- opts = MemoryContextAlloc(CacheMemoryContext, VARSIZE(bytea_opts));
+ opts = MemoryContextAlloc(CacheMemoryContext, VARSIZE(bytea_opts),
+ FileAndLineTag());
memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
}
ReleaseSysCache(tp);
diff --git a/src/backend/utils/cache/ts_cache.c b/src/backend/utils/cache/ts_cache.c
index 4ad5e7f..ea15490 100644
--- a/src/backend/utils/cache/ts_cache.c
+++ b/src/backend/utils/cache/ts_cache.c
@@ -501,7 +501,8 @@ lookup_ts_config_cache(Oid cfgId)
maplists[maxtokentype].len = ndicts;
maplists[maxtokentype].dictIds = (Oid *)
MemoryContextAlloc(CacheMemoryContext,
- sizeof(Oid) * ndicts);
+ sizeof(Oid) * ndicts,
+ FileAndLineTag());
memcpy(maplists[maxtokentype].dictIds, mapdicts,
sizeof(Oid) * ndicts);
}
@@ -528,14 +529,15 @@ lookup_ts_config_cache(Oid cfgId)
maplists[maxtokentype].len = ndicts;
maplists[maxtokentype].dictIds = (Oid *)
MemoryContextAlloc(CacheMemoryContext,
- sizeof(Oid) * ndicts);
+ sizeof(Oid) * ndicts, FileAndLineTag());
memcpy(maplists[maxtokentype].dictIds, mapdicts,
sizeof(Oid) * ndicts);
/* and save the overall map */
entry->lenmap = maxtokentype + 1;
entry->map = (ListDictionary *)
MemoryContextAlloc(CacheMemoryContext,
- sizeof(ListDictionary) * entry->lenmap);
+ sizeof(ListDictionary) * entry->lenmap,
+ FileAndLineTag());
memcpy(entry->map, maplists,
sizeof(ListDictionary) * entry->lenmap);
}
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index 46d7eda..4c240f8 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -366,7 +366,8 @@ fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
finfo->fn_addr = fmgr_oldstyle;
fnextra = (Oldstyle_fnextra *)
MemoryContextAllocZero(finfo->fn_mcxt,
- sizeof(Oldstyle_fnextra));
+ sizeof(Oldstyle_fnextra),
+ FileAndLineTag());
finfo->fn_extra = (void *) fnextra;
fnextra->func = (func_ptr) user_fn;
for (i = 0; i < procedureStruct->pronargs; i++)
@@ -588,7 +589,8 @@ fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo,
Oldstyle_fnextra *fnextra;
fnextra = (Oldstyle_fnextra *)
- MemoryContextAlloc(destcxt, sizeof(Oldstyle_fnextra));
+ MemoryContextAlloc(destcxt, sizeof(Oldstyle_fnextra),
+ FileAndLineTag());
memcpy(fnextra, srcinfo->fn_extra, sizeof(Oldstyle_fnextra));
dstinfo->fn_extra = (void *) fnextra;
}
@@ -896,7 +898,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
MemoryContext oldcxt;
fcache = MemoryContextAllocZero(fcinfo->flinfo->fn_mcxt,
- sizeof(*fcache));
+ sizeof(*fcache), FileAndLineTag());
fmgr_info_cxt_security(fcinfo->flinfo->fn_oid, &fcache->flinfo,
fcinfo->flinfo->fn_mcxt, true);
diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c
index dd91478..62c53aa 100644
--- a/src/backend/utils/fmgr/funcapi.c
+++ b/src/backend/utils/fmgr/funcapi.c
@@ -81,7 +81,7 @@ init_MultiFuncCall(PG_FUNCTION_ARGS)
*/
retval = (FuncCallContext *)
MemoryContextAllocZero(multi_call_ctx,
- sizeof(FuncCallContext));
+ sizeof(FuncCallContext), FileAndLineTag());
/*
* initialize the elements
diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/hash/dynahash.c
index 6d0e0f5..2c3320b 100644
--- a/src/backend/utils/hash/dynahash.c
+++ b/src/backend/utils/hash/dynahash.c
@@ -214,7 +214,7 @@ static void *
DynaHashAlloc(Size size)
{
Assert(MemoryContextIsValid(CurrentDynaHashCxt));
- return MemoryContextAlloc(CurrentDynaHashCxt, size);
+ return MemoryContextAlloc(CurrentDynaHashCxt, size, FileAndLineTag());
}
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 848c26f..6fe9794 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -133,7 +133,8 @@ PrepareClientEncoding(int encoding)
* Load the fmgr info into TopMemoryContext (could still fail here)
*/
convinfo = (ConvProcInfo *) MemoryContextAlloc(TopMemoryContext,
- sizeof(ConvProcInfo));
+ sizeof(ConvProcInfo),
+ FileAndLineTag());
convinfo->s_encoding = current_server_encoding;
convinfo->c_encoding = encoding;
fmgr_info_cxt(to_server_proc, &convinfo->to_server_info,
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d75ab43..b1a223f 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4356,7 +4356,8 @@ push_old_value(struct config_generic * gconf, GucAction action)
* We keep all the stack entries in TopTransactionContext for simplicity.
*/
stack = (GucStack *) MemoryContextAllocZero(TopTransactionContext,
- sizeof(GucStack));
+ sizeof(GucStack),
+ FileAndLineTag());
stack->prev = gconf->stack;
stack->nest_level = GUCNestLevel;
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c
index c5a331c..24d6944 100644
--- a/src/backend/utils/mmgr/aset.c
+++ b/src/backend/utils/mmgr/aset.c
@@ -64,8 +64,87 @@
#include "postgres.h"
+#include "access/hash.h"
#include "utils/memutils.h"
+struct mem_alloc_tracker {
+ const char *tag;
+ unsigned allocations;
+ unsigned bytes;
+ struct mem_alloc_tracker *next;
+};
+
+#define MEM_ALLOC_TRACKER_BUCKETS 8192
+struct mem_alloc_tracker mem_alloc_hashtab[MEM_ALLOC_TRACKER_BUCKETS];
+
+static void
+count_allocation(const char *tag, unsigned bytes)
+{
+ int s;
+ Datum h;
+ unsigned b;
+ struct mem_alloc_tracker *mb;
+
+ Assert(tag != NULL);
+
+ s = strlen(tag);
+ h = hash_any((const unsigned char *) tag, s);
+ b = ((uint32) h) % MEM_ALLOC_TRACKER_BUCKETS;
+ mb = &mem_alloc_hashtab[b];
+
+ if (!mb->tag)
+ {
+ mb->tag = tag;
+ mb->allocations = 1;
+ mb->bytes = bytes;
+ }
+ else if (!strcmp(mb->tag, tag))
+ {
+ mb->allocations++;
+ mb->bytes += bytes;
+ }
+ else
+ {
+ struct mem_alloc_tracker *n;
+
+ for (mb = mb->next; mb != NULL; mb = mb->next)
+ {
+ if (!strcmp(mb->tag, tag))
+ {
+ mb->allocations++;
+ mb->bytes += bytes;
+ return;
+ }
+ }
+
+ n = malloc(sizeof(struct mem_alloc_tracker));
+ n->tag = tag;
+ n->allocations = 1;
+ n->bytes = bytes;
+ n->next = mem_alloc_hashtab[b].next;
+ mem_alloc_hashtab[b].next = n;
+ }
+}
+
+void
+dump_allocations(void)
+{
+ unsigned b;
+
+ for (b = 0; b < MEM_ALLOC_TRACKER_BUCKETS; ++b)
+ {
+ struct mem_alloc_tracker *mb = &mem_alloc_hashtab[b];
+ if (!mb->tag)
+ continue;
+ while (mb != NULL)
+ {
+ write_stderr("ALLOCATE %s %u %u\n",
+ mb->tag, mb->allocations, mb->bytes);
+ mb = mb->next;
+ }
+ }
+}
+
/* Define this to detail debug alloc information */
/* #define HAVE_ALLOCINFO */
@@ -209,9 +288,9 @@ typedef struct AllocChunkData
/*
* These functions implement the MemoryContext API for AllocSet contexts.
*/
-static void *AllocSetAlloc(MemoryContext context, Size size);
+static void *AllocSetAlloc(MemoryContext context, Size size, const char *tag);
static void AllocSetFree(MemoryContext context, void *pointer);
-static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size);
+static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size, const char *tag);
static void AllocSetInit(MemoryContext context);
static void AllocSetReset(MemoryContext context);
static void AllocSetDelete(MemoryContext context);
@@ -350,20 +429,21 @@ randomize_mem(char *ptr, size_t size)
* maxBlockSize: maximum allocation block size
*/
MemoryContext
-AllocSetContextCreate(MemoryContext parent,
+AllocSetContextCreate_really(MemoryContext parent,
const char *name,
Size minContextSize,
Size initBlockSize,
- Size maxBlockSize)
+ Size maxBlockSize,
+ const char *tag)
{
AllocSet context;
/* Do the type-independent part of context creation */
- context = (AllocSet) MemoryContextCreate(T_AllocSetContext,
+ context = (AllocSet) MemoryContextCreate_really(T_AllocSetContext,
sizeof(AllocSetContext),
&AllocSetMethods,
parent,
- name);
+ name, tag);
/*
* Make sure alloc parameters are reasonable, and save them.
@@ -559,7 +639,7 @@ AllocSetDelete(MemoryContext context)
* to the set.
*/
static void *
-AllocSetAlloc(MemoryContext context, Size size)
+AllocSetAlloc(MemoryContext context, Size size, const char *tag)
{
AllocSet set = (AllocSet) context;
AllocBlock block;
@@ -568,6 +648,8 @@ AllocSetAlloc(MemoryContext context, Size size)
Size chunk_size;
Size blksize;
+ count_allocation(tag, size);
+
AssertArg(AllocSetIsValid(set));
/*
@@ -892,7 +974,7 @@ AllocSetFree(MemoryContext context, void *pointer)
* into the new memory, and the old memory is freed.
*/
static void *
-AllocSetRealloc(MemoryContext context, void *pointer, Size size)
+AllocSetRealloc(MemoryContext context, void *pointer, Size size, const char *tag)
{
AllocSet set = (AllocSet) context;
AllocChunk chunk = AllocPointerGetChunk(pointer);
@@ -1008,7 +1090,7 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
AllocPointer newPointer;
/* allocate new chunk */
- newPointer = AllocSetAlloc((MemoryContext) set, size);
+ newPointer = AllocSetAlloc((MemoryContext) set, size, tag);
/* transfer existing data (certain to fit) */
memcpy(newPointer, pointer, oldsize);
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index 466d53d..966b164 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -507,10 +507,10 @@ MemoryContextContains(MemoryContext context, void *pointer)
*--------------------
*/
MemoryContext
-MemoryContextCreate(NodeTag tag, Size size,
+MemoryContextCreate_really(NodeTag tag, Size size,
MemoryContextMethods *methods,
MemoryContext parent,
- const char *name)
+ const char *name, const char *stag)
{
MemoryContext node;
Size needed = size + strlen(name) + 1;
@@ -520,7 +520,7 @@ MemoryContextCreate(NodeTag tag, Size size,
{
/* Normal case: allocate the node in TopMemoryContext */
node = (MemoryContext) MemoryContextAlloc(TopMemoryContext,
- needed);
+ needed, stag);
}
else
{
@@ -564,7 +564,7 @@ MemoryContextCreate(NodeTag tag, Size size,
* nodes/memnodes.h into postgres.h which seems a bad idea.
*/
void *
-MemoryContextAlloc(MemoryContext context, Size size)
+MemoryContextAlloc(MemoryContext context, Size size, const char *tag)
{
AssertArg(MemoryContextIsValid(context));
@@ -574,7 +574,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
context->isReset = false;
- return (*context->methods->alloc) (context, size);
+ return (*context->methods->alloc) (context, size, tag);
}
/*
@@ -585,7 +585,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
* is a very common combination, so we provide the combined operation.
*/
void *
-MemoryContextAllocZero(MemoryContext context, Size size)
+MemoryContextAllocZero(MemoryContext context, Size size, const char *tag)
{
void *ret;
@@ -597,7 +597,7 @@ MemoryContextAllocZero(MemoryContext context, Size size)
context->isReset = false;
- ret = (*context->methods->alloc) (context, size);
+ ret = (*context->methods->alloc) (context, size, tag);
MemSetAligned(ret, 0, size);
@@ -612,7 +612,8 @@ MemoryContextAllocZero(MemoryContext context, Size size)
* is so often called with compile-time-constant sizes.
*/
void *
-MemoryContextAllocZeroAligned(MemoryContext context, Size size)
+MemoryContextAllocZeroAligned(MemoryContext context, Size size,
+ const char *tag)
{
void *ret;
@@ -624,7 +625,7 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
context->isReset = false;
- ret = (*context->methods->alloc) (context, size);
+ ret = (*context->methods->alloc) (context, size, tag);
MemSetLoop(ret, 0, size);
@@ -664,7 +665,7 @@ pfree(void *pointer)
* Adjust the size of a previously allocated chunk.
*/
void *
-repalloc(void *pointer, Size size)
+repalloc_really(void *pointer, Size size, const char *tag)
{
StandardChunkHeader *header;
@@ -692,7 +693,7 @@ repalloc(void *pointer, Size size)
Assert(!header->context->isReset);
return (*header->context->methods->realloc) (header->context,
- pointer, size);
+ pointer, size, tag);
}
/*
@@ -722,12 +723,12 @@ MemoryContextSwitchTo(MemoryContext context)
* Like strdup(), but allocate from the specified context
*/
char *
-MemoryContextStrdup(MemoryContext context, const char *string)
+MemoryContextStrdup_really(MemoryContext context, const char *string, const char *tag)
{
char *nstr;
Size len = strlen(string) + 1;
- nstr = (char *) MemoryContextAlloc(context, len);
+ nstr = (char *) MemoryContextAlloc(context, len, tag);
memcpy(nstr, string, len);
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c
index cfb73c1..416bf2f 100644
--- a/src/backend/utils/mmgr/portalmem.c
+++ b/src/backend/utils/mmgr/portalmem.c
@@ -215,7 +215,8 @@ CreatePortal(const char *name, bool allowDup, bool dupSilent)
}
/* make new portal structure */
- portal = (Portal) MemoryContextAllocZero(PortalMemory, sizeof *portal);
+ portal = (Portal) MemoryContextAllocZero(PortalMemory, sizeof *portal,
+ FileAndLineTag());
/* initialize portal heap context; typically it won't store much */
portal->heap = AllocSetContextCreate(PortalMemory,
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c
index 7c771eb..c9e36a9 100644
--- a/src/backend/utils/resowner/resowner.c
+++ b/src/backend/utils/resowner/resowner.c
@@ -130,7 +130,8 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name)
ResourceOwner owner;
owner = (ResourceOwner) MemoryContextAllocZero(TopMemoryContext,
- sizeof(ResourceOwnerData));
+ sizeof(ResourceOwnerData),
+ FileAndLineTag());
owner->name = name;
if (parent)
@@ -467,7 +468,8 @@ RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
item = (ResourceReleaseCallbackItem *)
MemoryContextAlloc(TopMemoryContext,
- sizeof(ResourceReleaseCallbackItem));
+ sizeof(ResourceReleaseCallbackItem),
+ FileAndLineTag());
item->callback = callback;
item->arg = arg;
item->next = ResourceRelease_callbacks;
@@ -519,7 +521,8 @@ ResourceOwnerEnlargeBuffers(ResourceOwner owner)
{
newmax = 16;
owner->buffers = (Buffer *)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer),
+ FileAndLineTag());
owner->maxbuffers = newmax;
}
else
@@ -607,7 +610,8 @@ ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner)
{
newmax = 16;
owner->catrefs = (HeapTuple *)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(HeapTuple));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(HeapTuple),
+ FileAndLineTag());
owner->maxcatrefs = newmax;
}
else
@@ -678,7 +682,8 @@ ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner)
{
newmax = 16;
owner->catlistrefs = (CatCList **)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CatCList *));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CatCList *),
+ FileAndLineTag());
owner->maxcatlistrefs = newmax;
}
else
@@ -749,7 +754,8 @@ ResourceOwnerEnlargeRelationRefs(ResourceOwner owner)
{
newmax = 16;
owner->relrefs = (Relation *)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Relation));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Relation),
+ FileAndLineTag());
owner->maxrelrefs = newmax;
}
else
@@ -830,7 +836,8 @@ ResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner)
{
newmax = 16;
owner->planrefs = (CachedPlan **)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CachedPlan *));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CachedPlan *),
+ FileAndLineTag());
owner->maxplanrefs = newmax;
}
else
@@ -910,7 +917,8 @@ ResourceOwnerEnlargeTupleDescs(ResourceOwner owner)
{
newmax = 16;
owner->tupdescs = (TupleDesc *)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(TupleDesc));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(TupleDesc),
+ FileAndLineTag());
owner->maxtupdescs = newmax;
}
else
@@ -992,7 +1000,8 @@ ResourceOwnerEnlargeSnapshots(ResourceOwner owner)
{
newmax = 16;
owner->snapshots = (Snapshot *)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Snapshot));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Snapshot),
+ FileAndLineTag());
owner->maxsnapshots = newmax;
}
else
@@ -1075,7 +1084,8 @@ ResourceOwnerEnlargeFiles(ResourceOwner owner)
{
newmax = 16;
owner->files = (File *)
- MemoryContextAlloc(TopMemoryContext, newmax * sizeof(File));
+ MemoryContextAlloc(TopMemoryContext, newmax * sizeof(File),
+ FileAndLineTag());
owner->maxfiles = newmax;
}
else
diff --git a/src/backend/utils/sort/sortsupport.c b/src/backend/utils/sort/sortsupport.c
index 7f388fd..5bf6ede 100644
--- a/src/backend/utils/sort/sortsupport.c
+++ b/src/backend/utils/sort/sortsupport.c
@@ -111,7 +111,8 @@ PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup)
SortShimExtra *extra;
extra = (SortShimExtra *) MemoryContextAlloc(ssup->ssup_cxt,
- sizeof(SortShimExtra));
+ sizeof(SortShimExtra),
+ FileAndLineTag());
/* Lookup the comparison function */
fmgr_info_cxt(cmpFunc, &extra->flinfo, ssup->ssup_cxt);
diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c
index 5429922..ad1bf3d 100644
--- a/src/backend/utils/time/combocid.c
+++ b/src/backend/utils/time/combocid.c
@@ -221,7 +221,8 @@ GetComboCommandId(CommandId cmin, CommandId cmax)
comboCids = (ComboCidKeyData *)
MemoryContextAlloc(TopTransactionContext,
- sizeof(ComboCidKeyData) * CCID_ARRAY_SIZE);
+ sizeof(ComboCidKeyData) * CCID_ARRAY_SIZE,
+ FileAndLineTag());
sizeComboCids = CCID_ARRAY_SIZE;
usedComboCids = 0;
}
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 574099d..080f76c 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -325,7 +325,8 @@ CopySnapshot(Snapshot snapshot)
if (snapshot->subxcnt > 0)
size += snapshot->subxcnt * sizeof(TransactionId);
- newsnap = (Snapshot) MemoryContextAlloc(TopTransactionContext, size);
+ newsnap = (Snapshot) MemoryContextAlloc(TopTransactionContext, size,
+ FileAndLineTag());
memcpy(newsnap, snapshot, sizeof(SnapshotData));
newsnap->regd_count = 0;
@@ -390,7 +391,9 @@ PushActiveSnapshot(Snapshot snap)
Assert(snap != InvalidSnapshot);
- newactive = MemoryContextAlloc(TopTransactionContext, sizeof(ActiveSnapshotElt));
+ newactive = MemoryContextAlloc(TopTransactionContext,
+ sizeof(ActiveSnapshotElt),
+ FileAndLineTag());
/*
* Checking SecondarySnapshot is probably useless here, but it seems
diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h
index bcca70d..bc1b9fe 100644
--- a/src/include/nodes/bitmapset.h
+++ b/src/include/nodes/bitmapset.h
@@ -58,9 +58,14 @@ typedef enum
* function prototypes in nodes/bitmapset.c
*/
-extern Bitmapset *bms_copy(const Bitmapset *a);
+#define bms_make_singleton(x) \
+ bms_make_singleton_really(x, FileAndLineTag())
+#define bms_copy(x) \
+ bms_copy_really(x, FileAndLineTag())
+
+extern Bitmapset *bms_copy_really(const Bitmapset *a, const char *tag);
extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);
-extern Bitmapset *bms_make_singleton(int x);
+extern Bitmapset *bms_make_singleton_really(int x, const char *tag);
extern void bms_free(Bitmapset *a);
extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);
@@ -80,9 +85,13 @@ extern bool bms_is_empty(const Bitmapset *a);
/* these routines recycle (modify or free) their non-const inputs: */
-extern Bitmapset *bms_add_member(Bitmapset *a, int x);
+#define bms_add_member(a, x) bms_add_member_really(a, x, FileAndLineTag())
+#define bms_add_members(a, b) bms_add_members_really(a, b, FileAndLineTag())
+
+extern Bitmapset *bms_add_member_really(Bitmapset *a, int x, const char *tag);
extern Bitmapset *bms_del_member(Bitmapset *a, int x);
-extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);
+extern Bitmapset *bms_add_members_really(Bitmapset *a, const Bitmapset *b,
+ const char *tag);
extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);
extern Bitmapset *bms_del_members(Bitmapset *a, const Bitmapset *b);
extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);
diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h
index a6dffe6..c9f78da 100644
--- a/src/include/nodes/makefuncs.h
+++ b/src/include/nodes/makefuncs.h
@@ -23,25 +23,35 @@ extern A_Expr *makeA_Expr(A_Expr_Kind kind, List *name,
extern A_Expr *makeSimpleA_Expr(A_Expr_Kind kind, char *name,
Node *lexpr, Node *rexpr, int location);
-extern Var *makeVar(Index varno,
+#define makeVar(a, b, c, d, e, f) \
+ makeVar_really(a, b, c, d, e, f, FileAndLineTag())
+
+extern Var *makeVar_really(Index varno,
AttrNumber varattno,
Oid vartype,
int32 vartypmod,
Oid varcollid,
- Index varlevelsup);
+ Index varlevelsup, const char *tag);
+
+#define makeVarFromTargetEntry(a, b) \
+ makeVarFromTargetEntry_really(a, b, FileAndLineTag())
-extern Var *makeVarFromTargetEntry(Index varno,
- TargetEntry *tle);
+extern Var *makeVarFromTargetEntry_really(Index varno,
+ TargetEntry *tle, const char *tag);
extern Var *makeWholeRowVar(RangeTblEntry *rte,
Index varno,
Index varlevelsup,
bool allowScalar);
-extern TargetEntry *makeTargetEntry(Expr *expr,
+#define makeTargetEntry(a, b, c, d) \
+ makeTargetEntry_really(a, b, c, d, FileAndLineTag())
+
+extern TargetEntry *makeTargetEntry_really(Expr *expr,
AttrNumber resno,
char *resname,
- bool resjunk);
+ bool resjunk,
+ const char *tag);
extern TargetEntry *flatCopyTargetEntry(TargetEntry *src_tle);
diff --git a/src/include/nodes/memnodes.h b/src/include/nodes/memnodes.h
index 503d59f..f1bb843 100644
--- a/src/include/nodes/memnodes.h
+++ b/src/include/nodes/memnodes.h
@@ -35,10 +35,10 @@
typedef struct MemoryContextMethods
{
- void *(*alloc) (MemoryContext context, Size size);
+ void *(*alloc) (MemoryContext context, Size size, const char *tag);
/* call this free_p in case someone #define's free() */
void (*free_p) (MemoryContext context, void *pointer);
- void *(*realloc) (MemoryContext context, void *pointer, Size size);
+ void *(*realloc) (MemoryContext context, void *pointer, Size size, const char *tag);
void (*init) (MemoryContext context);
void (*reset) (MemoryContext context);
void (*delete_context) (MemoryContext context);
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 1e16088..516a123 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -447,10 +447,10 @@ typedef struct Node
#ifdef __GNUC__
/* With GCC, we can use a compound statement within an expression */
-#define newNode(size, tag) \
+#define newNode(size, tag, stag) \
({ Node *_result; \
AssertMacro((size) >= sizeof(Node)); /* need the tag, at least */ \
- _result = (Node *) palloc0fast(size); \
+ _result = (Node *) palloc0fastwithtag(size, stag); \
_result->type = (tag); \
_result; \
})
@@ -464,17 +464,18 @@ typedef struct Node
*/
extern PGDLLIMPORT Node *newNodeMacroHolder;
-#define newNode(size, tag) \
+#define newNode(size, tag, stag) \
( \
AssertMacro((size) >= sizeof(Node)), /* need the tag, at least */ \
- newNodeMacroHolder = (Node *) palloc0fast(size), \
+ newNodeMacroHolder = (Node *) palloc0fastwithtag(size, stag), \
newNodeMacroHolder->type = (tag), \
newNodeMacroHolder \
)
#endif /* __GNUC__ */
-#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_))
+#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_,FileAndLineTag()))
+#define makeNodeWithTag(_type_,_tag_) ((_type_ *) newNode(sizeof(_type_),T_##_type_,_tag_))
#define NodeSetTag(nodeptr,t) (((Node*)(nodeptr))->type = (t))
#define IsA(nodeptr,_type_) (nodeTag(nodeptr) == T_##_type_)
diff --git a/src/include/nodes/pg_list.h b/src/include/nodes/pg_list.h
index 15b86dd..344c095 100644
--- a/src/include/nodes/pg_list.h
+++ b/src/include/nodes/pg_list.h
@@ -136,6 +136,10 @@ extern int list_length(const List *l);
#define llast_int(l) lfirst_int(list_tail(l))
#define llast_oid(l) lfirst_oid(list_tail(l))
+#define lcons(d, l) lcons_really(d, l, FileAndLineTag())
+#define lcons_int(d, l) lcons_int_really(d, l, FileAndLineTag())
+#define lcons_oid(d, l) lcons_oid_really(d, l, FileAndLineTag())
+
/*
* Convenience macros for building fixed-length lists
*/
@@ -191,17 +195,21 @@ extern int list_length(const List *l);
(cell1) != NULL && (cell2) != NULL && (cell3) != NULL; \
(cell1) = lnext(cell1), (cell2) = lnext(cell2), (cell3) = lnext(cell3))
-extern List *lappend(List *list, void *datum);
-extern List *lappend_int(List *list, int datum);
-extern List *lappend_oid(List *list, Oid datum);
+extern List *lappend_really(List *list, void *datum, const char *tag);
+extern List *lappend_int_really(List *list, int datum, const char *tag);
+extern List *lappend_oid_really(List *list, Oid datum, const char *tag);
+
+#define lappend(l, d) lappend_really(l, d, FileAndLineTag())
+#define lappend_int(l, d) lappend_int_really(l, d, FileAndLineTag())
+#define lappend_oid(l, d) lappend_oid_really(l, d, FileAndLineTag())
extern ListCell *lappend_cell(List *list, ListCell *prev, void *datum);
extern ListCell *lappend_cell_int(List *list, ListCell *prev, int datum);
extern ListCell *lappend_cell_oid(List *list, ListCell *prev, Oid datum);
-extern List *lcons(void *datum, List *list);
-extern List *lcons_int(int datum, List *list);
-extern List *lcons_oid(Oid datum, List *list);
+extern List *lcons_really(void *datum, List *list, const char *tag);
+extern List *lcons_int_really(int datum, List *list, const char *tag);
+extern List *lcons_oid_really(Oid datum, List *list, const char *tag);
extern List *list_concat(List *list1, List *list2);
extern List *list_truncate(List *list, int new_size);
@@ -236,10 +244,23 @@ extern List *list_difference_ptr(const List *list1, const List *list2);
extern List *list_difference_int(const List *list1, const List *list2);
extern List *list_difference_oid(const List *list1, const List *list2);
-extern List *list_append_unique(List *list, void *datum);
-extern List *list_append_unique_ptr(List *list, void *datum);
-extern List *list_append_unique_int(List *list, int datum);
-extern List *list_append_unique_oid(List *list, Oid datum);
+extern List *list_append_unique_really(List *list, void *datum,
+ const char *tag);
+extern List *list_append_unique_ptr_really(List *list, void *datum,
+ const char *tag);
+extern List *list_append_unique_int_really(List *list, int datum,
+ const char *tag);
+extern List *list_append_unique_oid_really(List *list, Oid datum,
+ const char *tag);
+
+#define list_append_unique(l, d) \
+ list_append_unique_really(l, d, FileAndLineTag())
+#define list_append_unique_ptr(l, d) \
+ list_append_unique_ptr_really(l, d, FileAndLineTag())
+#define list_append_unique_int(l, d) \
+ list_append_unique_int_really(l, d, FileAndLineTag())
+#define list_append_unique_oid(l, d) \
+ list_append_unique_oid_really(l, d, FileAndLineTag())
extern List *list_concat_unique(List *list1, List *list2);
extern List *list_concat_unique_ptr(List *list1, List *list2);
@@ -249,8 +270,12 @@ extern List *list_concat_unique_oid(List *list1, List *list2);
extern void list_free(List *list);
extern void list_free_deep(List *list);
-extern List *list_copy(const List *list);
-extern List *list_copy_tail(const List *list, int nskip);
+#define list_copy(l) list_copy_really(l, FileAndLineTag())
+#define list_copy_tail(l, n) list_copy_tail_really(l, n, FileAndLineTag())
+
+extern List *list_copy_really(const List *list, const char *tag);
+extern List *list_copy_tail_really(const List *list, int nskip,
+ const char *tag);
/*
* To ease migration to the new list API, a set of compatibility
diff --git a/src/include/nodes/value.h b/src/include/nodes/value.h
index 523a906..d643a0a 100644
--- a/src/include/nodes/value.h
+++ b/src/include/nodes/value.h
@@ -53,9 +53,11 @@ typedef struct Value
#define floatVal(v) atof(((Value *)(v))->val.str)
#define strVal(v) (((Value *)(v))->val.str)
+#define makeString(x) makeString_really(x, FileAndLineTag())
+
extern Value *makeInteger(long i);
extern Value *makeFloat(char *numericStr);
-extern Value *makeString(char *str);
+extern Value *makeString_really(char *str, const char *tag);
extern Value *makeBitString(char *str);
#endif /* VALUE_H */
diff --git a/src/include/utils/memutils.h b/src/include/utils/memutils.h
index a2bb3d9..4163873 100644
--- a/src/include/utils/memutils.h
+++ b/src/include/utils/memutils.h
@@ -108,10 +108,14 @@ extern bool MemoryContextContains(MemoryContext context, void *pointer);
* context creation. It's intended to be called from context-type-
* specific creation routines, and noplace else.
*/
-extern MemoryContext MemoryContextCreate(NodeTag tag, Size size,
+
+#define MemoryContextCreate(a, b, c, d, e) \
+ MemoryContextCreate_really(a, b, c, d, e, FileAndLineTag())
+
+extern MemoryContext MemoryContextCreate_really(NodeTag tag, Size size,
MemoryContextMethods *methods,
MemoryContext parent,
- const char *name);
+ const char *name, const char *stag);
/*
@@ -119,11 +123,14 @@ extern MemoryContext MemoryContextCreate(NodeTag tag, Size size,
*/
/* aset.c */
-extern MemoryContext AllocSetContextCreate(MemoryContext parent,
+#define AllocSetContextCreate(a, b, c, d, e) \
+ AllocSetContextCreate_really(a, b, c, d, e, FileAndLineTag())
+
+extern MemoryContext AllocSetContextCreate_really(MemoryContext parent,
const char *name,
Size minContextSize,
Size initBlockSize,
- Size maxBlockSize);
+ Size maxBlockSize, const char *tag);
/*
* Recommended default alloc parameters, suitable for "ordinary" contexts
@@ -141,4 +148,6 @@ extern MemoryContext AllocSetContextCreate(MemoryContext parent,
#define ALLOCSET_SMALL_INITSIZE (1 * 1024)
#define ALLOCSET_SMALL_MAXSIZE (8 * 1024)
+extern void dump_allocations(void);
+
#endif /* MEMUTILS_H */
diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h
index 973f306..277f5cc 100644
--- a/src/include/utils/palloc.h
+++ b/src/include/utils/palloc.h
@@ -45,13 +45,16 @@ extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
/*
* Fundamental memory-allocation operations (more are in utils/memutils.h)
*/
-extern void *MemoryContextAlloc(MemoryContext context, Size size);
-extern void *MemoryContextAllocZero(MemoryContext context, Size size);
-extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
+extern void *MemoryContextAlloc(MemoryContext context, Size size, const char *tag);
+extern void *MemoryContextAllocZero(MemoryContext context, Size size, const char *tag);
+extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size, const char *tag);
-#define palloc(sz) MemoryContextAlloc(CurrentMemoryContext, (sz))
+#define CppMacroAsString(x) CppAsString(x)
+#define FileAndLineTag() (__FILE__ ":" CppMacroAsString(__LINE__))
-#define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz))
+#define palloc(sz) MemoryContextAlloc(CurrentMemoryContext, (sz), FileAndLineTag())
+
+#define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz), FileAndLineTag())
/*
* The result of palloc() is always word-aligned, so we can skip testing
@@ -63,12 +66,19 @@ extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
*/
#define palloc0fast(sz) \
( MemSetTest(0, sz) ? \
- MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \
- MemoryContextAllocZero(CurrentMemoryContext, sz) )
+ MemoryContextAllocZeroAligned(CurrentMemoryContext, sz, FileAndLineTag()) : \
+ MemoryContextAllocZero(CurrentMemoryContext, sz, FileAndLineTag()) )
+
+#define palloc0fastwithtag(sz, tag) \
+ ( MemSetTest(0, sz) ? \
+ MemoryContextAllocZeroAligned(CurrentMemoryContext, sz, tag) : \
+ MemoryContextAllocZero(CurrentMemoryContext, sz, tag) )
extern void pfree(void *pointer);
-extern void *repalloc(void *pointer, Size size);
+extern void *repalloc_really(void *pointer, Size size, const char *tag);
+
+#define repalloc(p, s) repalloc_really(p, s, FileAndLineTag())
/*
* MemoryContextSwitchTo can't be a macro in standard C compilers.
@@ -97,8 +107,9 @@ extern MemoryContext MemoryContextSwitchTo(MemoryContext context);
* These are like standard strdup() except the copied string is
* allocated in a context, not with malloc().
*/
-extern char *MemoryContextStrdup(MemoryContext context, const char *string);
+extern char *MemoryContextStrdup_really(MemoryContext context, const char *string, const char *tag);
+#define MemoryContextStrdup(a, b) MemoryContextStrdup_really(a, b, FileAndLineTag())
#define pstrdup(str) MemoryContextStrdup(CurrentMemoryContext, (str))
extern char *pnstrdup(const char *in, Size len);
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index d43b8e0..68adf0b 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -321,7 +321,8 @@ do_compile(FunctionCallInfo fcinfo,
if (function == NULL)
{
function = (PLpgSQL_function *)
- MemoryContextAllocZero(TopMemoryContext, sizeof(PLpgSQL_function));
+ MemoryContextAllocZero(TopMemoryContext, sizeof(PLpgSQL_function),
+ FileAndLineTag());
}
else
{
@@ -364,7 +365,8 @@ do_compile(FunctionCallInfo fcinfo,
plpgsql_nDatums = 0;
/* This is short-lived, so needn't allocate in function's cxt */
plpgsql_Datums = MemoryContextAlloc(compile_tmp_cxt,
- sizeof(PLpgSQL_datum *) * datums_alloc);
+ sizeof(PLpgSQL_datum *) * datums_alloc,
+ FileAndLineTag());
datums_last = 0;
switch (is_trigger)
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 95e74b3..16dd5ef 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -5909,7 +5909,8 @@ plpgsql_create_econtext(PLpgSQL_execstate *estate)
*/
entry = (SimpleEcontextStackEntry *)
MemoryContextAlloc(TopTransactionContext,
- sizeof(SimpleEcontextStackEntry));
+ sizeof(SimpleEcontextStackEntry),
+ FileAndLineTag());
entry->stack_econtext = estate->eval_econtext;
entry->xact_subxid = GetCurrentSubTransactionId();
diff --git a/src/pl/plpython/plpy_util.c b/src/pl/plpython/plpy_util.c
index 414b9d5..f95bffb 100644
--- a/src/pl/plpython/plpy_util.c
+++ b/src/pl/plpython/plpy_util.c
@@ -21,7 +21,7 @@ void *
PLy_malloc(size_t bytes)
{
/* We need our allocations to be long-lived, so use TopMemoryContext */
- return MemoryContextAlloc(TopMemoryContext, bytes);
+ return MemoryContextAlloc(TopMemoryContext, bytes, FileAndLineTag());
}
void *