[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r14321: Fix behavior of memarea freelists. (in tor/trunk: . src/common)
Author: nickm
Date: 2008-04-08 13:50:03 -0400 (Tue, 08 Apr 2008)
New Revision: 14321
Modified:
tor/trunk/
tor/trunk/src/common/memarea.c
Log:
r19247@catbus: nickm | 2008-04-08 13:50:01 -0400
Fix behavior of memarea freelists.
Property changes on: tor/trunk
___________________________________________________________________
svk:merge ticket from /tor/trunk [r19247] on 8246c3cf-6607-4228-993b-4d95d33730f1
Modified: tor/trunk/src/common/memarea.c
===================================================================
--- tor/trunk/src/common/memarea.c 2008-04-08 17:33:29 UTC (rev 14320)
+++ tor/trunk/src/common/memarea.c 2008-04-08 17:50:03 UTC (rev 14321)
@@ -68,16 +68,16 @@
/** Helper: allocate a new memarea chunk of around <b>chunk_size</b> bytes. */
static memarea_chunk_t *
-alloc_chunk(size_t sz)
+alloc_chunk(size_t sz, int freelist_ok)
{
- (void)sz; /*XXXX021 remove this argument. */
- if (freelist) {
+ if (freelist && freelist_ok) {
memarea_chunk_t *res = freelist;
freelist = res->next_chunk;
+ res->next_chunk = NULL;
--freelist_len;
return res;
} else {
- size_t chunk_size = CHUNK_SIZE;
+ size_t chunk_size = freelist_ok ? CHUNK_SIZE : sz;
memarea_chunk_t *res = tor_malloc_roundup(&chunk_size);
res->next_chunk = NULL;
res->mem_size = chunk_size - CHUNK_HEADER_SIZE;
@@ -93,6 +93,7 @@
++freelist_len;
chunk->next_chunk = freelist;
freelist = chunk;
+ chunk->next_mem = chunk->u.mem;
} else {
tor_free(chunk);
}
@@ -103,7 +104,7 @@
memarea_new(size_t chunk_size)/*XXXX021 remove this argument.*/
{
memarea_t *head = tor_malloc(sizeof(memarea_t));
- head->first = alloc_chunk(chunk_size);
+ head->first = alloc_chunk(chunk_size, 1);
(void)chunk_size;
return head;
}
@@ -179,12 +180,12 @@
if (sz+CHUNK_HEADER_SIZE >= area->chunk_size) {
/* This allocation is too big. Stick it in a special chunk, and put
* that chunk second in the list. */
- memarea_chunk_t *new_chunk = alloc_chunk(sz+CHUNK_HEADER_SIZE);
+ memarea_chunk_t *new_chunk = alloc_chunk(sz+CHUNK_HEADER_SIZE, 0);
new_chunk->next_chunk = chunk->next_chunk;
chunk->next_chunk = new_chunk;
chunk = new_chunk;
} else {
- memarea_chunk_t *new_chunk = alloc_chunk(area->chunk_size);
+ memarea_chunk_t *new_chunk = alloc_chunk(area->chunk_size, 1);
new_chunk->next_chunk = chunk;
area->first = chunk = new_chunk;
}