Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5362:9e86dbe68663 HEAD
Added data_stack_set_clean_after_pop()
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 18 Mar 2007 05:09:36 +0200 |
parents | bde589bd09d4 |
children | 235433e7d9c2 |
files | src/lib/data-stack.c src/lib/data-stack.h |
diffstat | 2 files changed, 30 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/data-stack.c Sun Mar 18 04:51:19 2007 +0200 +++ b/src/lib/data-stack.c Sun Mar 18 05:09:36 2007 +0200 @@ -29,7 +29,7 @@ #ifdef DEBUG # define CLEAR_CHR 0xde -#elif defined(USE_GC) +#else # define CLEAR_CHR 0 #endif @@ -69,6 +69,7 @@ static struct stack_block *last_buffer_block; static size_t last_buffer_size; +static bool clean_after_pop = FALSE; unsigned int t_push(void) { @@ -114,7 +115,6 @@ return data_stack_frame++; } -#ifndef USE_GC static void free_blocks(struct stack_block *block) { struct stack_block *next; @@ -125,16 +125,27 @@ next = block->next; if (unused_block == NULL || block->size > unused_block->size) { + if (clean_after_pop) { + memset(STACK_BLOCK_DATA(unused_block), + CLEAR_CHR, unused_block->size); + } +#ifndef USE_GC free(unused_block); +#endif unused_block = block; } else { + if (clean_after_pop) { + memset(STACK_BLOCK_DATA(block), CLEAR_CHR, + block->size); + } +#ifndef USE_GC free(block); +#endif } block = next; } } -#endif unsigned int t_pop(void) { @@ -147,16 +158,14 @@ /* update the current block */ current_block = current_frame_block->block[frame_pos]; current_block->left = current_frame_block->block_space_used[frame_pos]; -#ifdef CLEAR_CHR - memset(STACK_BLOCK_DATA(current_block) + - (current_block->size - current_block->left), CLEAR_CHR, - current_block->left); -#endif + if (clean_after_pop) { + memset(STACK_BLOCK_DATA(current_block) + + (current_block->size - current_block->left), CLEAR_CHR, + current_block->left); + } if (current_block->next != NULL) { /* free unused blocks */ -#ifndef USE_GC free_blocks(current_block->next); -#endif current_block->next = NULL; } @@ -351,6 +360,11 @@ t_malloc_real(size, TRUE); } +void data_stack_set_clean_after_pop(bool enable) +{ + clean_after_pop = enable; +} + void data_stack_init(void) { if (data_stack_frame == 0) { @@ -531,6 +545,9 @@ current_frame = NULL; buffer_mem = NULL; +#ifdef DEBUG + clean_after_pop = TRUE; +#endif t_push(); }
--- a/src/lib/data-stack.h Sun Mar 18 04:51:19 2007 +0200 +++ b/src/lib/data-stack.h Sun Mar 18 05:09:36 2007 +0200 @@ -90,6 +90,9 @@ t_buffer_alloc(sizeof(type) * (size)) void t_buffer_alloc(size_t size); +/* If enabled, all the used memory is cleared after t_pop(). */ +void data_stack_set_clean_after_pop(bool enable); + void data_stack_init(void); void data_stack_deinit(void);