[mpich2-commits] r7659 - mpich2/trunk/src/mpi/pt2pt

goodell at mcs.anl.gov goodell at mcs.anl.gov
Tue Jan 4 13:51:27 CST 2011


Author: goodell
Date: 2011-01-04 13:51:27 -0600 (Tue, 04 Jan 2011)
New Revision: 7659

Modified:
   mpich2/trunk/src/mpi/pt2pt/bsendutil.c
Log:
bugfix: MPIR_Buffer_attach alignment was inconsistent, fixes #1149

Reviewed by buntinas at .

Modified: mpich2/trunk/src/mpi/pt2pt/bsendutil.c
===================================================================
--- mpich2/trunk/src/mpi/pt2pt/bsendutil.c	2011-01-04 18:37:49 UTC (rev 7658)
+++ mpich2/trunk/src/mpi/pt2pt/bsendutil.c	2011-01-04 19:51:27 UTC (rev 7659)
@@ -93,7 +93,7 @@
 int MPIR_Bsend_attach( void *buffer, int buffer_size )
 {
     MPIR_Bsend_data_t *p;
-    long        offset;
+    size_t offset, align_sz;
 
 #   ifdef HAVE_ERROR_CHECKING
     {
@@ -128,11 +128,14 @@
     BsendBuffer.origbuffer_size	= buffer_size;
     BsendBuffer.buffer		= buffer;
     BsendBuffer.buffer_size	= buffer_size;
-    offset = ((long)buffer) % sizeof(void *);
+
+    /* Make sure that the buffer that we use is aligned to align_sz.  Some other
+       code assumes pointer-alignment, and some code assumes double alignment
+       (see #1149). */
+    align_sz = MPIR_MAX(sizeof(void *), sizeof(double));
+    offset = ((size_t)buffer) % sizeof(void *);
     if (offset) {
-	/* Make sure that the buffer that we use is aligned for pointers,
-	   because the code assumes that */
-	offset = sizeof(void *) - offset;
+        offset = align_sz - offset;
 	buffer = (char *)buffer + offset;
 	BsendBuffer.buffer      = buffer;
 	BsendBuffer.buffer_size -= offset;
@@ -145,7 +148,7 @@
     p		  = (MPIR_Bsend_data_t *)buffer;
     p->size	  = buffer_size - BSENDDATA_HEADER_TRUE_SIZE;
     p->total_size = buffer_size;
-    p->next	  = p->prev = 0;
+    p->next	  = p->prev = NULL;
     p->msg.msgbuf = (char *)p + BSENDDATA_HEADER_TRUE_SIZE;
 
     return MPI_SUCCESS;



More information about the mpich2-commits mailing list