123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #include "private.h"
- /* flag to indicate whether to check memory or not */
- static bool_t checking = BOOL_FALSE;
- typedef struct
- {
- bool_t result;
- unsigned free_blocks;
- lub_heap_t *heap;
- } check_arg_t;
- /*--------------------------------------------------------- */
- static void
- process_segment(void *s,
- unsigned index,
- size_t size,
- void *a)
- {
- lub_heap_segment_t *segment = s;
- lub_heap_block_t *block = lub_heap_block_getfirst(segment);
- check_arg_t *arg = a;
- /*
- * don't bother checking if this segment has zero blocks
- */
- if(arg->heap->stats.free_blocks || arg->heap->stats.alloc_blocks)
- {
- arg->result = lub_heap_block_check(block);
- if(BOOL_TRUE == arg->result)
- {
- /* check that the first block has the segment set */
- arg->result = (block->free.tag.segment == 1) ? BOOL_TRUE : BOOL_FALSE;
- if(block->free.tag.free)
- {
- ++arg->free_blocks;
- }
- }
-
- /* now iterate along the block chain checking each one */
- while((BOOL_TRUE == arg->result)
- && (block = lub_heap_block_getnext(block)))
- {
- /* check this block */
- arg->result = lub_heap_block_check(block);
- if(BOOL_TRUE == arg->result)
- {
- /* ensure that all non-first blocks have the segment clear */
- arg->result = (block->free.tag.segment == 0) ? BOOL_TRUE : BOOL_FALSE;
- if(block->free.tag.free)
- {
- ++arg->free_blocks;
- }
- }
- }
- }
- }
- /*--------------------------------------------------------- */
- bool_t
- lub_heap_check(bool_t enable)
- {
- bool_t result = checking;
-
- checking = enable;
-
- return result;
- }
- /*--------------------------------------------------------- */
- bool_t
- lub_heap_is_checking(void)
- {
- return checking;
- }
- /*--------------------------------------------------------- */
- bool_t
- lub_heap_check_memory(lub_heap_t *this)
- {
- check_arg_t arg;
-
- arg.result = BOOL_TRUE;
-
- if(BOOL_TRUE == checking)
- {
- arg.free_blocks = 0;
- arg.heap = this;
- /* iterate all the segments in the system */
- lub_heap_foreach_segment(this,process_segment,&arg);
-
- /* now check that the stats map to the available free blocks
- * checking the alloc blocks is more difficult because of the hidden
- * overheads when performing leak detection.
- */
- if( (this->stats.free_blocks != arg.free_blocks) )
- {
- arg.result = BOOL_FALSE;
- }
- }
- return arg.result;
- }
- /*--------------------------------------------------------- */
|