*** xlog.c	Sun Apr 24 03:49:54 2005
--- xlog.dio.c	Mon May 23 19:14:21 2005
***************
*** 74,79 ****
--- 74,98 ----
  #endif
  #endif
  
+ #ifdef O_DIRECT
+ #define OPEN_DIRECT_FLAG		O_DIRECT
+ #endif
+ 
+ /* TODO: Aligment depends on OS and filesystem. */
+ #define O_DIRECT_BUFFER_ALIGN	4096
+ 
+ /* assume sizeof(ptrdiff_t) == sizeof(void*) */
+ #define POINTERALIGN(ALIGNVAL,PTR)  \
+ 	(((ptrdiff_t) (PTR) + (ALIGNVAL-1)) & ~((ptrdiff_t) (ALIGNVAL-1)))
+ 
+ #ifdef OPEN_DIRECT_FLAG
+ #define XLOG_EXTRA_BUFFERS		O_DIRECT_BUFFER_ALIGN
+ #define XLOG_BUFFERS_ALIGN(PTR)	(char *)POINTERALIGN(XLOG_EXTRA_BUFFERS, (PTR))
+ #else
+ #define XLOG_EXTRA_BUFFERS		0
+ #define XLOG_BUFFERS_ALIGN(PTR)	(char *)POINTERALIGN(MAXIMUM_ALIGNOF, (PTR))
+ #endif
+ 
  #if defined(OPEN_DATASYNC_FLAG)
  #define DEFAULT_SYNC_METHOD_STR    "open_datasync"
  #define DEFAULT_SYNC_METHOD		   SYNC_METHOD_OPEN
*************** XLOGShmemSize(void)
*** 3417,3423 ****
  		XLOGbuffers = MinXLOGbuffers;
  
  	return MAXALIGN(sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers)
! 		+ BLCKSZ * XLOGbuffers +
  		MAXALIGN(sizeof(ControlFileData));
  }
  
--- 3436,3442 ----
  		XLOGbuffers = MinXLOGbuffers;
  
  	return MAXALIGN(sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers)
! 		+ XLOG_EXTRA_BUFFERS + BLCKSZ * XLOGbuffers +
  		MAXALIGN(sizeof(ControlFileData));
  }
  
*************** XLOGShmemInit(void)
*** 3435,3441 ****
  		ShmemInitStruct("XLOG Ctl",
  						MAXALIGN(sizeof(XLogCtlData) +
  								 sizeof(XLogRecPtr) * XLOGbuffers)
! 						+ BLCKSZ * XLOGbuffers,
  						&foundXLog);
  	ControlFile = (ControlFileData *)
  		ShmemInitStruct("Control File", sizeof(ControlFileData), &foundCFile);
--- 3454,3460 ----
  		ShmemInitStruct("XLOG Ctl",
  						MAXALIGN(sizeof(XLogCtlData) +
  								 sizeof(XLogRecPtr) * XLOGbuffers)
! 						+ XLOG_EXTRA_BUFFERS + BLCKSZ * XLOGbuffers,
  						&foundXLog);
  	ControlFile = (ControlFileData *)
  		ShmemInitStruct("Control File", sizeof(ControlFileData), &foundCFile);
*************** XLOGShmemInit(void)
*** 3463,3470 ****
  	 * buffers have worst-case alignment.
  	 */
  	XLogCtl->pages =
! 		((char *) XLogCtl) + MAXALIGN(sizeof(XLogCtlData) +
! 									  sizeof(XLogRecPtr) * XLOGbuffers);
  	memset(XLogCtl->pages, 0, BLCKSZ * XLOGbuffers);
  
  	/*
--- 3482,3489 ----
  	 * buffers have worst-case alignment.
  	 */
  	XLogCtl->pages =
! 		XLOG_BUFFERS_ALIGN(((char *) XLogCtl)
! 		+ sizeof(XLogCtlData) + sizeof(XLogRecPtr) * XLOGbuffers);
  	memset(XLogCtl->pages, 0, BLCKSZ * XLOGbuffers);
  
  	/*
*************** BootStrapXLOG(void)
*** 3494,3499 ****
--- 3513,3519 ----
  {
  	CheckPoint	checkPoint;
  	char	   *buffer;
+ 	char		buffer0[BLCKSZ + XLOG_EXTRA_BUFFERS + MAXIMUM_ALIGNOF];
  	XLogPageHeader page;
  	XLogLongPageHeader longpage;
  	XLogRecord *record;
*************** BootStrapXLOG(void)
*** 3522,3529 ****
  	/* First timeline ID is always 1 */
  	ThisTimeLineID = 1;
  
! 	/* Use malloc() to ensure buffer is MAXALIGNED */
! 	buffer = (char *) malloc(BLCKSZ);
  	page = (XLogPageHeader) buffer;
  	memset(buffer, 0, BLCKSZ);
  
--- 3542,3548 ----
  	/* First timeline ID is always 1 */
  	ThisTimeLineID = 1;
  
! 	buffer = XLOG_BUFFERS_ALIGN(buffer0);
  	page = (XLogPageHeader) buffer;
  	memset(buffer, 0, BLCKSZ);
  
*************** assign_xlog_sync_method(const char *meth
*** 5225,5230 ****
--- 5244,5256 ----
  		new_sync_bit = OPEN_DATASYNC_FLAG;
  	}
  #endif
+ #ifdef OPEN_DIRECT_FLAG
+ 	else if (pg_strcasecmp(method, "open_direct") == 0)
+ 	{
+ 		new_sync_method = SYNC_METHOD_OPEN;
+ 		new_sync_bit = OPEN_DIRECT_FLAG;
+ 	}
+ #endif
  	else
  		return NULL;
  
