浏览代码

estimate pagesize before compile time

Ioannis Koutras 11 年之前
父节点
当前提交
733fab53d2
共有 4 个文件被更改,包括 33 次插入12 次删除
  1. 22 0
      CMakeLists.txt
  2. 2 0
      config.h.cmake
  3. 8 9
      src/raw_block.c
  4. 1 3
      src/release_memory.c

+ 22 - 0
CMakeLists.txt

@@ -119,6 +119,28 @@ if(STATS STREQUAL "global")
   set(WITH_ALLOCATOR_STATS ON)
 endif(STATS STREQUAL "global")
 
+if(PAGESIZE_ALIGN)
+  execute_process(COMMAND getconf PAGESIZE OUTPUT_VARIABLE SYS_PAGESIZE)
+  string(STRIP ${SYS_PAGESIZE} SYS_PAGESIZE)
+  MATH( EXPR PS_NOT_POW_2 "${SYS_PAGESIZE} & (${SYS_PAGESIZE} - 1)" )
+  if(NOT SYS_PAGESIZE OR PS_NOT_POW_2)
+    message(FATAL_ERROR "System page size (" ${SYS_PAGESIZE}
+      ") is reported not to be a power of two.")
+  endif(NOT SYS_PAGESIZE OR PS_NOT_POW_2)
+  MATH( EXPR SAS_MOD_PG "${SYS_ALLOC_SIZE} % ${SYS_PAGESIZE}" )
+  if(SAS_MOD_PG)
+    message(FATAL_ERROR "System allocation size (" ${SYS_ALLOC_SIZE}
+      ") is not a multiple of the system page size (" ${SYS_PAGESIZE}
+      "). Please set it so that it is.")
+  endif(SAS_MOD_PG)
+endif(PAGESIZE_ALIGN)
+
+MATH( EXPR SAS_NOT_POW_2 "${SYS_ALLOC_SIZE} & (${SYS_ALLOC_SIZE} - 1)" )
+if(NOT SYS_ALLOC_SIZE OR SAS_NOT_POW_2)
+  message(FATAL_ERROR "You have to set SYS_ALLOC_SIZE (" ${SYS_ALLOC_SIZE}
+    ") to a power of two.")
+endif(NOT SYS_ALLOC_SIZE OR SAS_NOT_POW_2)
+
 configure_file (
 	"${PROJECT_SOURCE_DIR}/config.h.cmake"
 	"${PROJECT_BINARY_DIR}/dmmlib/config.h"

+ 2 - 0
config.h.cmake

@@ -149,6 +149,8 @@
 
 /** Make raw block requests for sizes that are multiple of the pagesize */
 #cmakedefine PAGESIZE_ALIGN
+/** System pagesize */
+#cmakedefine SYS_PAGESIZE @SYS_PAGESIZE@
 
 /** Data alignment */
 #cmakedefine DMM_DATA_ALIGNMENT @DMM_DATA_ALIGNMENT@

+ 8 - 9
src/raw_block.c

@@ -19,10 +19,6 @@
 
 #include <inttypes.h>
 
-#ifdef PAGESIZE_ALIGN
-#include <unistd.h> /* for pagesize */
-#endif /* PAGESIZE_ALIGN */
-
 #include "request_memory.h"
 #ifdef FL_RB_ONLY
 #include "dmmlib/freelist/freelist_rb.h"
@@ -47,14 +43,17 @@ raw_block_header_t *create_raw_block(size_t raw_block_size, rb_type type) {
     size_t requested_size = raw_block_size - sizeof(raw_block_header_t);
 #endif /* REQUEST_SIZE_INFO */
 
-    /* In case mmap() function is used, align the requested size to multiple of
-     * pagesizes */
+    if(type == BIGBLOCK) {
 #ifdef PAGESIZE_ALIGN
-    size_t pagesize = (size_t) sysconf(_SC_PAGESIZE);
-    raw_block_size = pagesize * ((raw_block_size + pagesize - 1) / pagesize);
+        raw_block_size = (raw_block_size + SYS_PAGESIZE - 1) &
+            (size_t) ~(SYS_PAGESIZE - 1);
+#else /* PAGESIZE_ALIGN */
+        raw_block_size = (raw_block_size + SYS_ALLOC_SIZE - 1) &
+            (size_t) ~(SYS_ALLOC_SIZE - 1);
 #endif /* PAGESIZE_ALIGN */
+    }
 
-    ptr = (raw_block_header_t *)request_memory(raw_block_size);
+    ptr = (raw_block_header_t *) request_memory(raw_block_size);
 
     if(ptr == NULL) {
         return NULL;

+ 1 - 3
src/release_memory.c

@@ -27,7 +27,6 @@
 
 #include <sys/mman.h>
 
-#include <unistd.h>
 #include <inttypes.h>
 #include <assert.h>
 
@@ -36,8 +35,7 @@ void release_memory(raw_block_header_t *raw_block) {
     int error_code;
 #endif /* WITH_DEBUG */
 
-    size_t pagesize = (size_t) sysconf(_SC_PAGESIZE);
-    size_t padding = (uintptr_t) raw_block % pagesize;
+    size_t padding = (uintptr_t) raw_block % SYS_PAGESIZE;
 
     if(padding != 0) {
 #ifdef WITH_DEBUG