/*********************************************************************
* free_all()
*
* Empties all memory regions so that their entire buffer space is
* considered unused. This allows the client to restart without
* having to reallocate memory for the allocator regions, which helps
* performance when this package gets used serially.
*********************************************************************/
__private_extern__
void free_all(void) {
    malloc_region * cur_region;

    queue_iterate(&malloc_region_list, cur_region, malloc_region *, links) {

        queue_init(&cur_region->block_list);
        cur_region->free_size = cur_region->region_size - sizeof(malloc_region);
        cur_region->free_address = &cur_region->buffer;

    }

    queue_init(&sorted_free_block_list);

#ifdef CLIENT_DEBUG
    current_block_total = 0;
#endif CLIENT_DEBUG

    return;

} /* free_all() */


/*********************************************************************
* malloc_size()
*
*********************************************************************/
__private_extern__
size_t malloc_size(void * address) {
    malloc_region * found_region = NULL;
    malloc_block  * found_block = NULL;

    malloc_find_block(address, &found_block, &found_region);


   /* If we couldn't find the requested block, 
    * the caller is in error so return 0.
    */
    if (found_block == NULL) {
        return 0;
        // FIXME: panic?
    }

    return (found_block->block_size - sizeof(malloc_block));

} /* malloc_size() */


/*********************************************************************
* malloc_is_valid()
*
*********************************************************************/
__private_extern__
int malloc_is_valid(void * address){
    malloc_region * found_region = NULL;
    malloc_block  * found_block = NULL;

    malloc_find_block(address, &found_block, &found_region);

    if (found_block != NULL) {
        return 1;
    } else {
        return 0;
    }

} /* malloc_is_valid() */


