diff options
author | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2007-05-27 22:08:38 +0800 |
---|---|---|
committer | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2007-05-27 22:08:38 +0800 |
commit | 6b957f167e59782f2342e692ac1fd749e2adf025 (patch) | |
tree | e31260435f615442ed7245e183d1cd518bdb40af /mbbsd/alloc.c | |
parent | 87ec87b5f570eeebb4b699140838ecd484ef8c1a (diff) | |
download | pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.tar pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.tar.gz pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.tar.bz2 pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.tar.lz pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.tar.xz pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.tar.zst pttbbs-6b957f167e59782f2342e692ac1fd749e2adf025.zip |
* hack dietlibc's allocator. release small block to OS.
* allocation behavior dirty hack for dietlibc.
Avoid allocate 64byte slot, use 128byte slot instead.
Thus, they share same memory block.
* save about 400mb for ptt.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3519 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/alloc.c')
-rw-r--r-- | mbbsd/alloc.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/mbbsd/alloc.c b/mbbsd/alloc.c index 06b84177..de676ce4 100644 --- a/mbbsd/alloc.c +++ b/mbbsd/alloc.c @@ -56,6 +56,9 @@ static void REGPARM(1) *do_mmap(size_t size) { static __alloc_t* __small_mem[8]; +static int smallalloc[8]; +static int smallalloc_max[8]; + #define __SMALL_NR(i) (MEM_BLOCK_SIZE/(i)) #define __MIN_SMALL_SIZE __SMALL_NR(256) /* 16 / 32 */ @@ -88,6 +91,17 @@ static void REGPARM(2) __small_free(void*_ptr,size_t _size) { ptr->next=__small_mem[idx]; __small_mem[idx]=ptr; + + smallalloc[idx]--; + + if (MEM_BLOCK_SIZE == PAGE_SIZE && + smallalloc[idx] == 0 && + smallalloc_max[idx] < __SMALL_NR(size)) { + __alloc_t* p = __small_mem[idx]; + __alloc_t* ph = p - (size_t)p%PAGE_SIZE; + munmap(ph, MEM_BLOCK_SIZE); + __small_mem[idx] = 0; + } } static void* REGPARM(1) __small_malloc(size_t _size) { @@ -119,6 +133,10 @@ static void* REGPARM(1) __small_malloc(size_t _size) { __small_mem[idx]=ptr->next; ptr->next=0; + smallalloc[idx]++; + if(smallalloc[idx] > smallalloc_max[idx]) + smallalloc_max[idx] = smallalloc[idx]; + return ptr; } |