Index: epan/emem.c =================================================================== --- epan/emem.c (revision 32066) +++ epan/emem.c (working copy) @@ -103,7 +103,8 @@ typedef struct _emem_header_t { emem_chunk_t *free_list; emem_chunk_t *used_list; - + GPtrArray* large_blocks; + emem_tree_t *trees; /* only used by se_mem allocator */ guint8 canary[EMEM_CANARY_DATA_SIZE]; @@ -263,6 +264,8 @@ mem->memory_alloc = emem_alloc_chunk; else mem->memory_alloc = emem_alloc_glib; + + mem->large_blocks = g_ptr_array_new(); } @@ -728,43 +731,50 @@ } #endif - /* make sure we dont try to allocate too much (arbitrary limit) */ - DISSECTOR_ASSERT(size<(EMEM_PACKET_CHUNK_SIZE>>2)); - - if (!mem->free_list) - mem->free_list = emem_create_chunk(); - - /* oops, we need to allocate more memory to serve this request - * than we have free. move this node to the used list and try again + /* + * when we try to allocate too much (arbitrary limit) + * for a chunk to handle, we just g_malloc()ate the + * buffer store it and return it */ - if(asize > mem->free_list->amount_free) { - emem_chunk_t *npc; - npc=mem->free_list; - mem->free_list=mem->free_list->next; - npc->next=mem->used_list; - mem->used_list=npc; + if (size<(EMEM_PACKET_CHUNK_SIZE>>2)) { + buf = g_malloc(size); + g_ptr_array_add(mem->large_blocks,buf); + } else { if (!mem->free_list) mem->free_list = emem_create_chunk(); - } - free_list = mem->free_list; + /* oops, we need to allocate more memory to serve this request + * than we have free. move this node to the used list and try again + */ + if(asize > mem->free_list->amount_free) { + emem_chunk_t *npc; + npc=mem->free_list; + mem->free_list=mem->free_list->next; + npc->next=mem->used_list; + mem->used_list=npc; - buf = free_list->buf + free_list->free_offset; + if (!mem->free_list) + mem->free_list = emem_create_chunk(); + } - free_list->amount_free -= (unsigned int) asize; - free_list->free_offset += (unsigned int) asize; + free_list = mem->free_list; - if (use_canary) { - char *cptr = (char *)buf + size; + buf = free_list->buf + free_list->free_offset; - memcpy(cptr, mem->canary, pad-1); - cptr[pad-1] = '\0'; - memcpy(cptr + pad, &free_list->canary_last, sizeof(void *)); + free_list->amount_free -= (unsigned int) asize; + free_list->free_offset += (unsigned int) asize; - free_list->canary_last = cptr; + if (use_canary) { + char *cptr = (char *)buf + size; + + memcpy(cptr, mem->canary, pad-1); + cptr[pad-1] = '\0'; + memcpy(cptr + pad, &free_list->canary_last, sizeof(void *)); + + free_list->canary_last = cptr; + } } - return buf; } @@ -1055,6 +1065,10 @@ mem->free_list=npc; } + while (mem->large_blocks->len) { + g_ptr_array_remove_index_fast(mem->large_blocks, mem->large_blocks->len - 1 ); + } + /* clear them all out */ npc = mem->free_list; while (npc != NULL) {