summaryrefslogtreecommitdiffstats
path: root/mbbsd/alloc.c
diff options
context:
space:
mode:
authorkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-05-27 22:08:38 +0800
committerkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-05-27 22:08:38 +0800
commit6b957f167e59782f2342e692ac1fd749e2adf025 (patch)
treee31260435f615442ed7245e183d1cd518bdb40af /mbbsd/alloc.c
parent87ec87b5f570eeebb4b699140838ecd484ef8c1a (diff)
downloadpttbbs-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.c18
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;
}