a new function CmiIsomallocAlign(align, size)
authorGengbin Zheng <gzheng@illinois.edu>
Thu, 24 Sep 2009 02:56:48 +0000 (02:56 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Thu, 24 Sep 2009 02:56:48 +0000 (02:56 +0000)
src/conv-core/converse.h
src/conv-core/isomalloc.c

index 34265c0c04f81770441e6762b4b46f279ed5630e..863a9fe976e294d22d46ebaab53cf91d211755f7 100644 (file)
@@ -1123,6 +1123,7 @@ void   CmiHandleMessage(void *msg);
 /****** Isomalloc: Migratable Memory Allocation ********/
 /*Simple block-by-block interface:*/
 void *CmiIsomalloc(int sizeInBytes);
+void *CmiIsomallocAlign(size_t align, size_t size);
 void  CmiIsomallocPup(pup_er p,void **block);
 void  CmiIsomallocFree(void *block);
 int   CmiIsomallocEnabled();
index c382b64e3cd170821c7a4b7cad2a0859b2468688..5cb0d95c898fd709ecf14c40b0d89cff975046dd 100644 (file)
@@ -2208,6 +2208,34 @@ void *CmiIsomalloc(int size)
        return block2pointer(blk);
 }
 
+#define MALLOC_ALIGNMENT           (2*sizeof(size_t))
+#define MINSIZE                    (sizeof(CmiIsomallocBlock))
+
+void *CmiIsomallocAlign(size_t align, size_t size)
+{
+        void *mem, *ptr;
+        CmiInt8 s = size, n, slot;
+
+        if (align < MINSIZE) align = MINSIZE;
+        /* make sure alignment is power of 2 */
+        if ((align & (align - 1)) != 0) {
+          size_t a = MALLOC_ALIGNMENT * 2;
+          while ((unsigned long)a < (unsigned long)align) a <<= 1;
+          align = a;
+        }
+        s += align;
+        ptr = CmiIsomalloc(s);
+        if ((((CmiUInt8)ptr) % align) != 0) { /* misaligned */
+          CmiIsomallocBlock *blk = pointer2block(ptr);
+          int slot = blk->slot;
+          int length = blk->length;
+          ptr = ((CmiUInt8)(ptr + align - 1)) & -((CmiInt8) align);
+          blk = pointer2block(ptr);
+        }
+       return ptr;
+}
+
+
 int CmiIsomallocEnabled()
 {
   return (isomallocStart!=NULL);