static bool restoreFromZapped( cv_t *cv ) { unsigned elm_size; free_t *free_list; free_t *curr_zapped; free_t *next_zapped; // we now check to make sure freed carve blocks have not been modified // but during PCH writing, we intentionally modify a free block to // distinguish them from allocated blocks thus we have to keep them // out of the free list until we can re-zap them elm_size = cv->elm_size; free_list = cv->free_list; curr_zapped = cv->zapped_free_list; if( curr_zapped != NULL ) { cv->zapped_free_list = NULL; do { next_zapped = curr_zapped->next_free; DbgZapFreed( curr_zapped, elm_size ); _ADD_TO_FREE( free_list, curr_zapped ); curr_zapped = next_zapped; } while( curr_zapped != NULL ); cv->free_list = free_list; return( true ); } return( false ); }
void CarveFree( carve_t cv, void *elm ) /*************************************/ { if( elm == NULL ) { return; } CarveDebugFree( cv, elm ); _ADD_TO_FREE( cv->free_list, elm ); }
static void MakeFreeList( cv_t *cv, blk_t *newblk, unsigned offset ) /******************************************************************/ { unsigned elm_size; char * top_elm; char * bottom_elm; char * free_elm; free_t * free_list; elm_size = cv->elm_size; bottom_elm = newblk->data + offset; top_elm = newblk->data + cv->blk_top; free_list = cv->free_list; free_elm = top_elm; do { /* free_list must be maintained in order */ free_elm -= elm_size; DbgZapFreed( free_elm, elm_size ); _ADD_TO_FREE( free_list, free_elm ); } while( free_elm != bottom_elm ); cv->free_list = free_list; }