diff --git a/lib/skin_parser/skin_buffer.c b/lib/skin_parser/skin_buffer.c
index 3c0870e..59c6a02 100644
--- a/lib/skin_parser/skin_buffer.c
+++ b/lib/skin_parser/skin_buffer.c
@@ -62,10 +62,14 @@ static unsigned char *buffer_front = NULL;
#ifdef USE_HOST_MALLOC
+#define MALLOC_BLOCK_SIZE (4*1024)
struct malloc_object {
- void* object;
+ size_t remaining;
+ char *start;
struct malloc_object *next;
+ char buf[];
};
+#define MALLOC_FREE_SPACE (MALLOC_BLOCK_SIZE - sizeof(struct malloc_object) - 32)
static struct malloc_object *malloced_head = NULL, *malloced_tail = NULL;
static void skin_free_malloced(void)
@@ -76,7 +80,6 @@ static void skin_free_malloced(void)
{
this = obj;
obj = this->next;
- free(this->object);
free(this);
}
malloced_head = NULL;
@@ -100,25 +103,37 @@ void skin_buffer_init(char* buffer, size_t size)
void* skin_buffer_alloc(size_t size)
{
void *retval = NULL;
+ size = (size + 3) & ~3;
#ifdef USE_ROCKBOX_ALLOC
/* 32-bit aligned */
- size = (size + 3) & ~3;
if (size > skin_buffer_freespace())
return NULL;
retval = buffer_front;
buffer_front += size;
#elif defined(USE_HOST_MALLOC)
- struct malloc_object *obj = malloc(sizeof (struct malloc_object));
- if (!obj)
- return NULL;
- obj->object = malloc(size);
- obj->next = NULL;
- if (malloced_tail == NULL)
- malloced_head = malloced_tail = obj;
+ if (malloced_tail && size <= malloced_tail->remaining)
+ {
+ retval = malloced_tail->start;
+ malloced_tail->start += size;
+ malloced_tail->remaining -= size;
+ }
else
- malloced_tail->next = obj;
- malloced_tail = obj;
- retval = obj->object;
+ {
+ size_t malloc_size = MALLOC_BLOCK_SIZE;
+ struct malloc_object *obj;
+ if (size > MALLOC_FREE_SPACE)
+ malloc_size = size + sizeof(struct malloc_object);
+ obj = malloc(malloc_size);
+ retval = obj->buf;
+ obj->start = obj->buf + size;
+ obj->remaining = malloc_size - sizeof(struct malloc_object);
+ obj->next = NULL;
+ if (malloced_tail == NULL)
+ malloced_head = malloced_tail = obj;
+ else
+ malloced_tail->next = obj;
+ malloced_tail = obj;
+ }
#else
retval = malloc(size);
#endif