changeset 7037:215e96e1f6a3 HEAD

DEBUG: Fixed clearing data stack memory.
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Dec 2007 06:18:07 +0200
parents 1ed56d4064f5
children a1353d4fc3b6
files src/lib/data-stack.c
diffstat 1 files changed, 14 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/data-stack.c	Sat Dec 22 06:05:16 2007 +0200
+++ b/src/lib/data-stack.c	Sat Dec 22 06:18:07 2007 +0200
@@ -31,7 +31,7 @@
 struct stack_block {
 	struct stack_block *next;
 
-	size_t size, left;
+	size_t size, left, lowwater;
 	/* unsigned char data[]; */
 };
 
@@ -125,20 +125,15 @@
 	while (block != NULL) {
 		next = block->next;
 
+		if (clean_after_pop)
+			memset(STACK_BLOCK_DATA(block), CLEAR_CHR, block->size);
+
 		if (unused_block == NULL || block->size > unused_block->size) {
-			if (clean_after_pop && unused_block != NULL) {
-				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
@@ -207,11 +202,12 @@
 
 		pos = current_block->size -
 			current_frame_block->block_space_used[frame_pos];
-		used_size = current_block->size - current_block->left;
+		used_size = current_block->size - current_block->lowwater;
 		memset(STACK_BLOCK_DATA(current_block) + pos, CLEAR_CHR,
 		       used_size - pos);
 	}
 	current_block->left = current_frame_block->block_space_used[frame_pos];
+	current_block->lowwater = current_block->left;
 
 	if (current_block->next != NULL) {
 		/* free unused blocks */
@@ -312,6 +308,12 @@
 		/* enough space in current block, use it */
 		ret = STACK_BLOCK_DATA(current_block) +
 			(current_block->size - current_block->left);
+
+		if (current_block->left - alloc_size <
+		    current_block->lowwater) {
+			current_block->lowwater =
+				current_block->left - alloc_size;
+		}
                 if (permanent)
 			current_block->left -= alloc_size;
 	} else {
@@ -327,6 +329,8 @@
 		}
 
 		block->left = block->size;
+		if (block->left - alloc_size < block->lowwater)
+			block->lowwater = block->left - alloc_size;
 		if (permanent)
 			block->left -= alloc_size;
 		block->next = NULL;