summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mbbsd/alloc.c18
-rw-r--r--mbbsd/fav.c5
-rw-r--r--mbbsd/pmore.c9
3 files changed, 32 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;
}
diff --git a/mbbsd/fav.c b/mbbsd/fav.c
index eb9a40dc..e4b0e74e 100644
--- a/mbbsd/fav.c
+++ b/mbbsd/fav.c
@@ -524,7 +524,12 @@ int fav_load(void)
if ((frp = fopen(buf, "r")) == NULL)
return -1;
+#ifdef CRITICAL_MEMORY
+ // kcwu: dirty hack, avoid 64byte slot. use 128 instead.
+ fp = (fav_t *)fav_malloc(sizeof(fav_t)+64);
+#else
fp = (fav_t *)fav_malloc(sizeof(fav_t));
+#endif
fav_number = 0;
fread(&version, sizeof(version), 1, frp);
// if (version != FAV_VERSION) { ... }
diff --git a/mbbsd/pmore.c b/mbbsd/pmore.c
index 26f73a38..dd22ed60 100644
--- a/mbbsd/pmore.c
+++ b/mbbsd/pmore.c
@@ -809,7 +809,16 @@ mf_parseHeaders()
// p is pointing at a new line. (\n)
l = (int)(p - pb);
+#ifdef CRITICAL_MEMORY
+ // kcwu: dirty hack, avoid 64byte slot. use 128byte slot instead.
+ if (l<100) {
+ p = (unsigned char*) malloc (100+1);
+ } else {
+ p = (unsigned char*) malloc (l+1);
+ }
+#else
p = (unsigned char*) malloc (l+1);
+#endif
fh.headers[i] = p;
memcpy(p, pb, l);
p[l] = 0;