diff options
Diffstat (limited to 'sapi/phpdbg/phpdbg_btree.c')
| -rw-r--r-- | sapi/phpdbg/phpdbg_btree.c | 35 | 
1 files changed, 29 insertions, 6 deletions
| diff --git a/sapi/phpdbg/phpdbg_btree.c b/sapi/phpdbg/phpdbg_btree.c index 9e7dc86e8e..7e1937fc73 100644 --- a/sapi/phpdbg/phpdbg_btree.c +++ b/sapi/phpdbg/phpdbg_btree.c @@ -25,14 +25,17 @@  	branch = branch->branches[!!(n)];  #ifdef _Win32 -# define emalloc malloc -# define efree free +# undef pemalloc +# undef pefree +# define pemalloc(size, persistent) malloc(size) +# define pefree(ptr, persistent) free(ptr)  #endif  /* depth in bits */  void phpdbg_btree_init(phpdbg_btree *tree, zend_ulong depth) {  	tree->depth = depth;  	tree->branch = NULL; +	tree->persistent = 0;  	tree->count = 0;  } @@ -157,7 +160,7 @@ int phpdbg_btree_insert_or_update(phpdbg_btree *tree, zend_ulong idx, void *ptr,  		}  		{ -			phpdbg_btree_branch *memory = *branch = emalloc((i + 2) * sizeof(phpdbg_btree_branch)); +			phpdbg_btree_branch *memory = *branch = pemalloc((i + 2) * sizeof(phpdbg_btree_branch), tree->persistent);  			do {  				(*branch)->branches[!((idx >> i) % 2)] = NULL;  				branch = &(*branch)->branches[(idx >> i) % 2]; @@ -199,14 +202,14 @@ check_branch_existence:  	tree->count--;  	if (i_last_dual_branch == -1) { -		efree(tree->branch); +		pefree(tree->branch, tree->persistent);  		tree->branch = NULL;  	} else {  		if (last_dual_branch->branches[last_dual_branch_branch] == last_dual_branch + 1) {  			phpdbg_btree_branch *original_branch = last_dual_branch->branches[!last_dual_branch_branch];  			memcpy(last_dual_branch + 1, last_dual_branch->branches[!last_dual_branch_branch], (i_last_dual_branch + 1) * sizeof(phpdbg_btree_branch)); -			efree(last_dual_branch->branches[!last_dual_branch_branch]); +			pefree(last_dual_branch->branches[!last_dual_branch_branch], tree->persistent);  			last_dual_branch->branches[!last_dual_branch_branch] = last_dual_branch + 1;  			branch = last_dual_branch->branches[!last_dual_branch_branch]; @@ -214,7 +217,7 @@ check_branch_existence:  				branch = (branch->branches[branch->branches[1] == ++original_branch] = last_dual_branch + i_last_dual_branch - i + 1);  			}  		} else { -			efree(last_dual_branch->branches[last_dual_branch_branch]); +			pefree(last_dual_branch->branches[last_dual_branch_branch], tree->persistent);  		}  		last_dual_branch->branches[last_dual_branch_branch] = NULL; @@ -223,6 +226,26 @@ check_branch_existence:  	return SUCCESS;  } +void phpdbg_btree_clean_recursive(phpdbg_btree_branch *branch, zend_ulong depth, zend_bool persistent) { +	phpdbg_btree_branch *start = branch; +	while (depth--) { +		zend_bool use_branch = branch + 1 == branch->branches[0]; +		if (branch->branches[use_branch]) { +			phpdbg_btree_clean_recursive(branch->branches[use_branch], depth, persistent); +		} +	} + +	pefree(start, persistent); +} + +void phpdbg_btree_clean(phpdbg_btree *tree) { +	if (tree->branch) { +		phpdbg_btree_clean_recursive(tree->branch, tree->depth, tree->persistent); +		tree->branch = NULL; +		tree->count = 0; +	} +} +  void phpdbg_btree_branch_dump(phpdbg_btree_branch *branch, zend_ulong depth) {  	if (branch) {  		if (depth--) { | 
