浏览代码

use mmap instead of posix_memalign (prevent libc allocating/keeping more memory than required)

ncannasse 6 年之前
父节点
当前提交
fa79a7271c
共有 1 个文件被更改,包括 7 次插入17 次删除
  1. 7 17
      src/alloc.c

+ 7 - 17
src/alloc.c

@@ -1173,24 +1173,13 @@ HL_PRIM void hl_free_executable_memory( void *c, int size ) {
 #endif
 #endif
 }
 }
 
 
-#ifdef HL_CONSOLE
+#if defined(HL_CONSOLE)
 void *sys_alloc_align( int size, int align );
 void *sys_alloc_align( int size, int align );
 void sys_free_align( void *ptr, int size );
 void sys_free_align( void *ptr, int size );
+#elif !defined(HL_WIN)
+static void *base_addr = (void*)0x40000000;
 #endif
 #endif
 
 
-#if defined(__ANDROID__) && !defined(HAVE_POSIX_MEMALIGN)
-int posix_memalign(void** memptr, size_t alignment, size_t size) {
-    if ((alignment & (alignment - 1)) != 0 || alignment == 0 || alignment % sizeof(void*) != 0) {
-        return 22; // Invalid argument (EINVAL)
-    }
-    *memptr = memalign(alignment, size);
-    if (*memptr == NULL) {
-        return 12; // Out of memory (ENOMEM)
-    }
-    return 0;
-}
-#endif /* __ANDROID_API__ < 17 */
-
 static void *gc_alloc_page_memory( int size ) {
 static void *gc_alloc_page_memory( int size ) {
 #if defined(HL_WIN)
 #if defined(HL_WIN)
 	void *ptr = VirtualAlloc(start_address,size,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
 	void *ptr = VirtualAlloc(start_address,size,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
@@ -1205,9 +1194,10 @@ static void *gc_alloc_page_memory( int size ) {
 #elif defined(HL_CONSOLE)
 #elif defined(HL_CONSOLE)
 	return sys_alloc_align(size, GC_PAGE_SIZE);
 	return sys_alloc_align(size, GC_PAGE_SIZE);
 #else
 #else
-	void *ptr;
-	if( posix_memalign(&ptr,GC_PAGE_SIZE,size) )
+	void *ptr = mmap(base_addr,size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
+	if( ptr == (void*)-1 )
 		return NULL;
 		return NULL;
+	base_addr = (char*)ptr+size;
 	return ptr;
 	return ptr;
 #endif
 #endif
 }
 }
@@ -1218,7 +1208,7 @@ static void gc_free_page_memory( void *ptr, int size ) {
 #elif defined(HL_CONSOLE)
 #elif defined(HL_CONSOLE)
 	sys_free_align(ptr,size);
 	sys_free_align(ptr,size);
 #else
 #else
-	free(ptr);
+	munmap(ptr,size);
 #endif
 #endif
 }
 }