PageGetTempPage(Page page, Size specialSize)
{
Size pageSize;
- Size size;
Page temp;
PageHeader thdr;
/* copy old page in */
memcpy(temp, page, pageSize);
- /* clear out the middle */
- size = pageSize - SizeOfPageHeaderData;
- size -= MAXALIGN(specialSize);
- MemSet(PageGetContents(thdr), 0, size);
-
/* set high, low water marks */
thdr->pd_lower = SizeOfPageHeaderData;
thdr->pd_upper = pageSize - MAXALIGN(specialSize);
+ /* clear out the middle */
+ MemSet((char *) temp + thdr->pd_lower, 0, thdr->pd_upper - thdr->pd_lower);
+
return temp;
}
/*
* Data (posting tree) pages
*/
+#define GinDataPageGetRightBound(page) ((ItemPointer) PageGetContents(page))
#define GinDataPageGetData(page) \
- (PageGetContents(page)+MAXALIGN(sizeof(ItemPointerData)))
-#define GinDataPageGetRightBound(page) ((ItemPointer)PageGetContents(page))
-#define GinSizeOfItem(page) ( (GinPageIsLeaf(page)) ? sizeof(ItemPointerData) : sizeof(PostingItem) )
-#define GinDataPageGetItem(page,i) ( GinDataPageGetData(page) + ((i)-1) * GinSizeOfItem(page) )
+ (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))
+#define GinSizeOfItem(page) \
+ (GinPageIsLeaf(page) ? sizeof(ItemPointerData) : sizeof(PostingItem))
+#define GinDataPageGetItem(page,i) \
+ (GinDataPageGetData(page) + ((i)-1) * GinSizeOfItem(page))
#define GinDataPageGetFreeSpace(page) \
- ( BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(GinPageOpaqueData)) - \
- GinPageGetOpaque(page)->maxoff * GinSizeOfItem(page) - \
- MAXALIGN(sizeof(ItemPointerData)))
-
+ (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
+ - MAXALIGN(sizeof(ItemPointerData)) \
+ - GinPageGetOpaque(page)->maxoff * GinSizeOfItem(page) \
+ - MAXALIGN(sizeof(GinPageOpaqueData)))
#define GIN_UNLOCK BUFFER_LOCK_UNLOCK
/*
* PageGetContents
* To be used in case the page does not contain item pointers.
+ *
+ * Note: prior to 8.3 this was not guaranteed to yield a MAXALIGN'd result.
+ * Now it is. Beware of old code that might think the offset to the contents
+ * is just SizeOfPageHeaderData rather than MAXALIGN(SizeOfPageHeaderData).
*/
#define PageGetContents(page) \
- ((char *) (&((PageHeader) (page))->pd_linp[0]))
+ ((char *) (page) + MAXALIGN(SizeOfPageHeaderData))
/* ----------------
* macros to access page size info