]> granicus.if.org Git - php/commitdiff
Support for different CPU page sizes
authorDmitry Stogov <dmitry@zend.com>
Tue, 2 Dec 2014 13:17:26 +0000 (16:17 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 2 Dec 2014 13:17:26 +0000 (16:17 +0300)
Zend/zend_alloc.c

index 1e031f48f54f9ec33958666f21184d09d6a7245f..8689ee8829f4335f3969ecbced0098c33e2da2ca 100644 (file)
 # endif
 # ifndef MAP_POPULATE
 #  define MAP_POPULATE 0
+# endif
+#  if defined(_SC_PAGESIZE) || (_SC_PAGE_SIZE)
+#    define REAL_PAGE_SIZE _real_page_size
+static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
+#  endif
 #endif
+
+#ifndef REAL_PAGE_SIZE
+# define REAL_PAGE_SIZE ZEND_MM_PAGE_SIZE
 #endif
 
 #ifndef ZEND_MM_STAT
@@ -739,10 +747,10 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
 
                /* chunk has to be aligned */
                zend_mm_munmap(ptr, size);
-               ptr = zend_mm_mmap(size + alignment - ZEND_MM_PAGE_SIZE);
+               ptr = zend_mm_mmap(size + alignment - REAL_PAGE_SIZE);
 #ifdef _WIN32
                offset = ZEND_MM_ALIGNED_OFFSET(ptr, alignment);
-               zend_mm_munmap(ptr, size + alignment - ZEND_MM_PAGE_SIZE);
+               zend_mm_munmap(ptr, size + alignment - REAL_PAGE_SIZE);
                ptr = zend_mm_mmap_fixed((void*)((char*)ptr + (alignment - offset)), size);
                offset = ZEND_MM_ALIGNED_OFFSET(ptr, alignment);
                if (offset != 0) {
@@ -757,7 +765,7 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
                        zend_mm_munmap(ptr, offset);
                        ptr = (char*)ptr + offset;
                } else {
-                       zend_mm_munmap((char*)ptr + size, alignment - ZEND_MM_PAGE_SIZE);
+                       zend_mm_munmap((char*)ptr + size, alignment - REAL_PAGE_SIZE);
                }
 # ifdef MADV_HUGEPAGE
            madvise(ptr, size, MADV_HUGEPAGE);
@@ -1394,7 +1402,7 @@ static void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size ZEN
 #if ZEND_DEBUG
                        size = real_size;
 #endif
-                       new_size = ZEND_MM_ALIGNED_SIZE_EX(size, ZEND_MM_PAGE_SIZE);
+                       new_size = ZEND_MM_ALIGNED_SIZE_EX(size, REAL_PAGE_SIZE);
                        if (new_size == old_size) {
 #if ZEND_DEBUG
                                zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
@@ -1642,7 +1650,7 @@ static void zend_mm_change_huge_block_size(zend_mm_heap *heap, void *ptr, size_t
 
 static void *zend_mm_alloc_huge(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
-       size_t new_size = ZEND_MM_ALIGNED_SIZE_EX(size, ZEND_MM_PAGE_SIZE);
+       size_t new_size = ZEND_MM_ALIGNED_SIZE_EX(size, REAL_PAGE_SIZE);
        void *ptr;
 
 #if ZEND_MM_LIMIT
@@ -2418,6 +2426,13 @@ ZEND_API void start_memory_manager(TSRMLS_D)
 #else
        alloc_globals_ctor(&alloc_globals);
 #endif
+#ifndef _WIN32
+#  if defined(_SC_PAGESIZE)
+       REAL_PAGE_SIZE = sysconf(_SC_PAGESIZE);
+#  elif defined(_SC_PAGE_SIZE)
+       REAL_PAGE_SIZE = sysconf(_SC_PAGE_SIZE);
+#  endif
+#endif
 }
 
 ZEND_API zend_mm_heap *zend_mm_set_heap(zend_mm_heap *new_heap TSRMLS_DC)