From 4cbfeef91291f4a4f38aa7ee7ee9030b94457fe1 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 24 Apr 1998 14:43:33 +0000 Subject: [PATCH] Inline some small functions called for every row. --- src/backend/access/transam/xid.c | 12 +----- src/backend/executor/execTuples.c | 54 ++------------------------ src/backend/executor/nodeTee.c | 4 +- src/backend/storage/buffer/bufmgr.c | 56 +-------------------------- src/backend/storage/page/bufpage.c | 23 +---------- src/backend/utils/time/tqual.c | 53 +++----------------------- src/include/access/xact.h | 14 ++++++- src/include/executor/executor.h | 42 ++++++++++++++++++-- src/include/storage/bufmgr.h | 59 +++++++++++++++++++++++++++-- src/include/storage/bufpage.h | 18 ++++++++- src/include/utils/tqual.h | 49 +++++++++++++++++++++--- 11 files changed, 179 insertions(+), 205 deletions(-) diff --git a/src/backend/access/transam/xid.c b/src/backend/access/transam/xid.c index 00810528c4..021c666ebf 100644 --- a/src/backend/access/transam/xid.c +++ b/src/backend/access/transam/xid.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/xid.c,v 1.14 1998/04/07 18:10:01 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/xid.c,v 1.15 1998/04/24 14:41:39 momjian Exp $ * * OLD COMMENTS * XXX WARNING @@ -53,16 +53,6 @@ xidout(TransactionId transactionId) } -/* ---------------------------------------------------------------- - * TransactionIdEquals - * ---------------------------------------------------------------- - */ -bool -TransactionIdEquals(TransactionId id1, TransactionId id2) -{ - return ((bool) (id1 == id2)); -} - /* ---------------------------------------------------------------- * TransactionIdIsLessThan * ---------------------------------------------------------------- diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 3d64ba0095..cd6ac66c9f 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.17 1998/02/26 04:31:14 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.18 1998/04/24 14:41:46 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -40,10 +40,10 @@ * ExecSetNewSlotDescriptor - set a desc and the is-new-flag all at once * ExecSlotBuffer - return buffer of tuple in slot * ExecSetSlotBuffer - set the buffer for tuple in slot - * ExecIncrSlotBufferRefcnt - bump the refcnt of the slot buffer + * ExecIncrSlotBufferRefcnt - bump the refcnt of the slot buffer(Macro) * * SLOT STATUS PREDICATES - * TupIsNull - true when slot contains no tuple + * TupIsNull - true when slot contains no tuple(Macro) * ExecSlotDescriptorIsNew - true if we're now storing a different * type of tuple in a slot * @@ -566,59 +566,11 @@ ExecSetSlotBuffer(TupleTableSlot *slot, /* slot to change */ #endif -/* -------------------------------- - * ExecIncrSlotBufferRefcnt - * - * When we pass around buffers in the tuple table, we have to - * be careful to increment reference counts appropriately. - * This is used mainly in the mergejoin code. - * -------------------------------- - */ -void -ExecIncrSlotBufferRefcnt(TupleTableSlot *slot) /* slot to bump refcnt */ -{ -/* Buffer b = SlotBuffer((TupleTableSlot*) slot); */ - Buffer b = slot->ttc_buffer; - - if (BufferIsValid(b)) - IncrBufferRefCount(b); -} - /* ---------------------------------------------------------------- * tuple table slot status predicates * ---------------------------------------------------------------- */ -/* ---------------- - * TupIsNull - * - * This is used mainly to detect when there are no more - * tuples to process. - * ---------------- - */ -bool /* return: true if tuple in slot is NULL */ -TupIsNull(TupleTableSlot *slot) /* slot to check */ -{ - HeapTuple tuple; /* contents of slot (returned) */ - - /* ---------------- - * if the slot itself is null then we return true - * ---------------- - */ - if (slot == NULL) - return true; - - /* ---------------- - * get information from the slot and return true or - * false depending on the contents of the slot. - * ---------------- - */ - tuple = slot->val; - - return - (tuple == NULL ? true : false); -} - /* -------------------------------- * ExecSlotDescriptorIsNew * diff --git a/src/backend/executor/nodeTee.c b/src/backend/executor/nodeTee.c index 23e09682ea..4a96dc2621 100644 --- a/src/backend/executor/nodeTee.c +++ b/src/backend/executor/nodeTee.c @@ -15,7 +15,7 @@ * ExecEndTee * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.16 1998/02/26 04:31:33 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.17 1998/04/24 14:41:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -27,7 +27,7 @@ #include "utils/palloc.h" #include "utils/relcache.h" #include "utils/mcxt.h" -#include "storage/bufmgr.h" /* for IncrBufferRefCount */ +#include "storage/bufmgr.h" #include "storage/smgr.h" #include "optimizer/internal.h" #include "executor/executor.h" diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 6b75bf5b75..7ab6019f99 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.36 1998/04/05 21:04:22 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.37 1998/04/24 14:42:16 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1262,25 +1262,6 @@ FlushBufferPool(int StableMainMemoryFlag) } } -/* - * BufferIsValid -- - * True iff the refcnt of the local buffer is > 0 - * Note: - * BufferIsValid(InvalidBuffer) is False. - * BufferIsValid(UnknownBuffer) is False. - */ -bool -BufferIsValid(Buffer bufnum) -{ - if (BufferIsLocal(bufnum)) - return (bufnum >= -NLocBuffer && LocalRefCount[-bufnum - 1] > 0); - - if (BAD_BUFFER_ID(bufnum)) - return (false); - - return ((bool) (PrivateRefCount[bufnum - 1] > 0)); -} - /* * BufferGetBlockNumber -- * Returns the block number associated with a buffer. @@ -1413,24 +1394,6 @@ RelationGetNumberOfBlocks(Relation relation) smgrnblocks(DEFAULT_SMGR, relation)); } -/* - * BufferGetBlock -- - * Returns a reference to a disk page image associated with a buffer. - * - * Note: - * Assumes buffer is valid. - */ -Block -BufferGetBlock(Buffer buffer) -{ - Assert(BufferIsValid(buffer)); - - if (BufferIsLocal(buffer)) - return ((Block) MAKE_PTR(LocalBufferDescriptors[-buffer - 1].data)); - else - return ((Block) MAKE_PTR(BufferDescriptors[buffer - 1].data)); -} - /* --------------------------------------------------------------------- * ReleaseRelationBuffers * @@ -1679,25 +1642,8 @@ BlowawayRelationBuffers(Relation rdesc, BlockNumber block) return (0); } -#undef IncrBufferRefCount #undef ReleaseBuffer -void -IncrBufferRefCount(Buffer buffer) -{ - if (BufferIsLocal(buffer)) - { - Assert(LocalRefCount[-buffer - 1] >= 0); - LocalRefCount[-buffer - 1]++; - } - else - { - Assert(!BAD_BUFFER_ID(buffer)); - Assert(PrivateRefCount[buffer - 1] >= 0); - PrivateRefCount[buffer - 1]++; - } -} - /* * ReleaseBuffer -- remove the pin on a buffer without * marking it dirty. diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index ae648c0fc4..13fdbf11c7 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.16 1998/04/06 02:38:17 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.17 1998/04/24 14:42:27 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -225,27 +225,6 @@ PageRestoreTempPage(Page tempPage, Page oldPage) pfree(tempPage); } -/* - * PageGetMaxOffsetNumber -- - * Returns the maximum offset number used by the given page. - * - * NOTE: The offset is invalid if the page is non-empty. - * Test whether PageIsEmpty before calling this routine - * and/or using its return value. - */ -OffsetNumber -PageGetMaxOffsetNumber(Page page) -{ - LocationIndex low; - OffsetNumber i; - - low = ((PageHeader) page)->pd_lower; - i = (low - (sizeof(PageHeaderData) - sizeof(ItemIdData))) - / sizeof(ItemIdData); - - return (i); -} - /* ---------------- * itemid stuff for PageRepairFragmentation * ---------------- diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c index bb0538eb79..3f9bc0410d 100644 --- a/src/backend/utils/time/tqual.c +++ b/src/backend/utils/time/tqual.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.14 1998/02/26 04:38:32 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.15 1998/04/24 14:42:42 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -31,8 +31,8 @@ extern bool PostgresIsInitialized; */ #ifndef GOODAMI -static TransactionId HeapSpecialTransactionId = InvalidTransactionId; -static CommandId HeapSpecialCommandId = FirstCommandId; +TransactionId HeapSpecialTransactionId = InvalidTransactionId; +CommandId HeapSpecialCommandId = FirstCommandId; void setheapoverride(bool on) @@ -49,54 +49,11 @@ setheapoverride(bool on) } } -/* static, but called in debug macro */ -bool -heapisoverride() -{ - if (!TransactionIdIsValid(HeapSpecialTransactionId)) - { - return (false); - } - - if (!TransactionIdEquals(GetCurrentTransactionId(), - HeapSpecialTransactionId) || - GetCurrentCommandId() != HeapSpecialCommandId) - { - HeapSpecialTransactionId = InvalidTransactionId; - - return (false); - } - return (true); -} - #endif /* !defined(GOODAMI) */ /* * XXX Transaction system override hacks end here */ -static bool HeapTupleSatisfiesItself(HeapTuple tuple); -static bool HeapTupleSatisfiesNow(HeapTuple tuple); - -/* - * HeapTupleSatisfiesScope -- - * True iff heap tuple satsifies a time qual. - * - * Note: - * Assumes heap tuple is valid. - */ -bool -HeapTupleSatisfiesVisibility(HeapTuple tuple, bool seeself) -{ - - if (TransactionIdEquals(tuple->t_xmax, AmiTransactionId)) - return (false); - - if (seeself == true || heapisoverride()) - return (HeapTupleSatisfiesItself(tuple)); - else - return (HeapTupleSatisfiesNow(tuple)); -} - /* * HeapTupleSatisfiesItself -- * True iff heap tuple is valid for "itself." @@ -119,7 +76,7 @@ HeapTupleSatisfiesVisibility(HeapTuple tuple, bool seeself) * (Xmax != my-transaction && the row was deleted by another transaction * Xmax is not committed))) that has not been committed */ -static bool +bool HeapTupleSatisfiesItself(HeapTuple tuple) { @@ -215,7 +172,7 @@ HeapTupleSatisfiesItself(HeapTuple tuple) * the serializability guarantees we provide don't extend to xacts * that do catalog accesses. this is unfortunate, but not critical. */ -static bool +bool HeapTupleSatisfiesNow(HeapTuple tuple) { if (AMI_OVERRIDE) diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 60bd8cab61..7abcb63e69 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: xact.h,v 1.12 1998/02/26 04:40:32 momjian Exp $ + * $Id: xact.h,v 1.13 1998/04/24 14:42:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -60,6 +60,17 @@ typedef TransactionStateData *TransactionState; #define StoreInvalidTransactionId(dest) \ (*((TransactionId*)dest) = NullTransactionId) + +/* ---------------------------------------------------------------- + * TransactionIdEquals + * ---------------------------------------------------------------- + */ +#define TransactionIdEquals(id1, id2) \ +( \ + ((bool) ((id1) == (id2))) \ +) + + /* ---------------- * extern definitions * ---------------- @@ -95,7 +106,6 @@ extern TransactionId DisabledTransactionId; extern TransactionId xidin(char *representation); extern char *xidout(TransactionId transactionId); extern bool xideq(TransactionId xid1, TransactionId xid2); -extern bool TransactionIdEquals(TransactionId id1, TransactionId id2); extern bool TransactionIdIsLessThan(TransactionId id1, TransactionId id2); extern void TransactionIdAdd(TransactionId *xid, int value); diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 0ce8dc3fc9..17ff71c2f9 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: executor.h,v 1.21 1998/02/26 04:41:19 momjian Exp $ + * $Id: executor.h,v 1.22 1998/04/24 14:43:07 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -14,10 +14,48 @@ #define EXECUTOR_H #include +#include #include #include #include +/* ---------------- + * TupIsNull + * + * This is used mainly to detect when there are no more + * tuples to process. + * ---------------- + */ +/* return: true if tuple in slot is NULL, slot is slot to test */ +#define TupIsNull(slot) \ +( \ + ((slot) == NULL) ? \ + true \ + : \ + ( \ + ((slot)->val == NULL) ? \ + true \ + : \ + false \ + ) \ +) + +/* -------------------------------- + * ExecIncrSlotBufferRefcnt + * + * When we pass around buffers in the tuple table, we have to + * be careful to increment reference counts appropriately. + * This is used mainly in the mergejoin code. + * -------------------------------- + */ +#define ExecIncrSlotBufferRefcnt(slot) \ +( \ + BufferIsValid((slot)->ttc_buffer) ? \ + IncrBufferRefCount((slot)->ttc_buffer) \ + : (void)NULL \ +) + + /* * prototypes from functions in execAmi.c */ @@ -107,8 +145,6 @@ extern TupleDesc ExecSetSlotDescriptor(TupleTableSlot *slot, TupleDesc tupdesc); extern void ExecSetSlotDescriptorIsNew(TupleTableSlot *slot, bool isNew); -extern void ExecIncrSlotBufferRefcnt(TupleTableSlot *slot); -extern bool TupIsNull(TupleTableSlot *slot); extern void ExecInitResultTupleSlot(EState *estate, CommonState *commonstate); extern void ExecInitScanTupleSlot(EState *estate, diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index fdc3abcee4..f27e9d1ed3 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: bufmgr.h,v 1.18 1998/02/26 04:43:22 momjian Exp $ + * $Id: bufmgr.h,v 1.19 1998/04/24 14:43:18 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -18,6 +18,7 @@ #include #include #include +#include #include /* @@ -72,6 +73,59 @@ extern int ShowPinTrace; #define BUFFER_FLUSH_WRITE 0 /* immediate write */ #define BUFFER_LATE_WRITE 1 /* delayed write: mark as DIRTY */ +/* + * BufferIsValid -- + * True iff the refcnt of the local buffer is > 0 + * Note: + * BufferIsValid(InvalidBuffer) is False. + * BufferIsValid(UnknownBuffer) is False. + */ +#define BufferIsValid(bufnum) \ +( \ + BufferIsLocal(bufnum) ? \ + ((bufnum) >= -NLocBuffer && LocalRefCount[-(bufnum) - 1] > 0) \ + : \ + ( \ + BAD_BUFFER_ID(bufnum) ? \ + false \ + : \ + (PrivateRefCount[(bufnum) - 1] > 0) \ + ) \ +) + +#define IncrBufferRefCount(buffer) \ +( \ + BufferIsLocal(buffer) ? \ + ( \ + (void)AssertMacro(LocalRefCount[-(buffer) - 1] >= 0), \ + (void)LocalRefCount[-(buffer) - 1]++ \ + ) \ + : \ + ( \ + (void)AssertMacro(!BAD_BUFFER_ID(buffer)), \ + (void)AssertMacro(PrivateRefCount[(buffer) - 1] >= 0), \ + (void)PrivateRefCount[(buffer) - 1]++ \ + ) \ +) + +/* + * BufferGetBlock -- + * Returns a reference to a disk page image associated with a buffer. + * + * Note: + * Assumes buffer is valid. + */ +#define BufferGetBlock(buffer) \ +( \ + (void)AssertMacro(BufferIsValid(buffer)), \ +\ + BufferIsLocal(buffer) ? \ + ((Block) MAKE_PTR(LocalBufferDescriptors[-(buffer) - 1].data)) \ + : \ + ((Block) MAKE_PTR(BufferDescriptors[(buffer) - 1].data)) \ +) + + /* * prototypes for functions in bufmgr.c */ @@ -91,17 +145,14 @@ extern void ResetBufferUsage(void); extern void ResetBufferPool(void); extern int BufferPoolCheckLeak(void); extern void FlushBufferPool(int StableMainMemoryFlag); -extern bool BufferIsValid(Buffer bufnum); extern BlockNumber BufferGetBlockNumber(Buffer buffer); extern Relation BufferGetRelation(Buffer buffer); extern BlockNumber RelationGetNumberOfBlocks(Relation relation); -extern Block BufferGetBlock(Buffer buffer); extern void ReleaseRelationBuffers(Relation rdesc); extern void DropBuffers(Oid dbid); extern void PrintBufferDescs(void); extern void PrintPinnedBufs(void); extern int BufferShmemSize(void); -extern void IncrBufferRefCount(Buffer buffer); extern int ReleaseBuffer(Buffer buffer); extern void BufferRefCountReset(int *refcountsave); diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index 2be7093e4c..c0701fc963 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: bufpage.h,v 1.17 1998/02/26 04:43:24 momjian Exp $ + * $Id: bufpage.h,v 1.18 1998/04/24 14:43:23 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -280,6 +280,21 @@ typedef enum */ #define BufferGetPage(buffer) ((Page)BufferGetBlock(buffer)) +/* + * PageGetMaxOffsetNumber -- + * Returns the maximum offset number used by the given page. + * + * NOTE: The offset is invalid if the page is non-empty. + * Test whether PageIsEmpty before calling this routine + * and/or using its return value. + */ +#define PageGetMaxOffsetNumber(page) \ +( \ + (((PageHeader) (page))->pd_lower - \ + (sizeof(PageHeaderData) - sizeof(ItemIdData))) \ + / sizeof(ItemIdData) \ +) + /* ---------------------------------------------------------------- * extern declarations @@ -292,7 +307,6 @@ PageAddItem(Page page, Item item, Size size, OffsetNumber offsetNumber, ItemIdFlags flags); extern Page PageGetTempPage(Page page, Size specialSize); extern void PageRestoreTempPage(Page tempPage, Page oldPage); -extern OffsetNumber PageGetMaxOffsetNumber(Page page); extern void PageRepairFragmentation(Page page); extern Size PageGetFreeSpace(Page page); extern void PageManagerModeSet(PageManagerMode mode); diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h index 6ee27af2c2..ab14efb52e 100644 --- a/src/include/utils/tqual.h +++ b/src/include/utils/tqual.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: tqual.h,v 1.11 1997/11/20 23:24:03 momjian Exp $ + * $Id: tqual.h,v 1.12 1998/04/24 14:43:33 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -15,12 +15,51 @@ #include -/* As above, plus updates in this command */ +extern TransactionId HeapSpecialTransactionId; +extern CommandId HeapSpecialCommandId; + +/* + * HeapTupleSatisfiesVisibility -- + * True iff heap tuple satsifies a time qual. + * + * Note: + * Assumes heap tuple is valid. + */ +#define HeapTupleSatisfiesVisibility(tuple, seeself) \ +( \ + TransactionIdEquals((tuple)->t_xmax, AmiTransactionId) ? \ + false \ + : \ + ( \ + ((seeself) == true || heapisoverride()) ? \ + HeapTupleSatisfiesItself(tuple) \ + : \ + HeapTupleSatisfiesNow(tuple) \ + ) \ +) + +#define heapisoverride() \ +( \ + (!TransactionIdIsValid(HeapSpecialTransactionId)) ? \ + false \ + : \ + ( \ + (!TransactionIdEquals(GetCurrentTransactionId(), \ + HeapSpecialTransactionId) || \ + GetCurrentCommandId() != HeapSpecialCommandId) ? \ + ( \ + HeapSpecialTransactionId = InvalidTransactionId, \ + false \ + ) \ + : \ + true \ + ) \ +) + +extern bool HeapTupleSatisfiesItself(HeapTuple tuple); +extern bool HeapTupleSatisfiesNow(HeapTuple tuple); extern void setheapoverride(bool on); -extern bool heapisoverride(void); - -extern bool HeapTupleSatisfiesVisibility(HeapTuple tuple, bool seeself); #endif /* TQUAL_H */