/* * Copyright (c) 2008-2009 Bill Whitacre http://rampancy.g0dsoft.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef RAT_PHYSICS_MEMORY #define RAT_PHYSICS_MEMORY #include #ifdef __cplusplus extern "C" { #endif // main alloc/dealloc functions, just calls dlmalloc|malloc/dlfree|free void rat_set_alloc_fn(void *(*alloc_fn)(size_t)); void rat_set_realloc_fn(void *(*realloc_fn)(void *,size_t)); void rat_set_dealloc_fn(void (*dealloc_fn)(void *)); void *rat_alloc(size_t size); void *rat_realloc(void *mem,size_t newsize); void rat_dealloc(void *mem); unsigned int rat_blocks_alloced(); unsigned int rat_mem_alloced(); void rat_mem_alloced_string(char *str); // a simple stack allocator // must push/pop memory allocations; faster than // arbitrary malloc/free by a int shot. struct rat_stack_allocator; typedef struct rat_stack_allocator rat_stack_allocator; extern const size_t rat_max_stack_cells; extern const size_t rat_stack_size; rat_stack_allocator *rat_stack_allocator_create(); void rat_stack_allocator_destroy(rat_stack_allocator *sal); void *rat_stack_alloc(rat_stack_allocator *sal,size_t size); void rat_stack_dealloc(rat_stack_allocator *sal,void *mem); unsigned int rat_stack_most_alloced(rat_stack_allocator *sal); // a simple small block allocator for objects of about // the same size being alloced/dealloced on a regular // basis. it is very fast at recycling struct rat_block_allocator; typedef struct rat_block_allocator rat_block_allocator; extern const unsigned int rat_chunk_size; extern const unsigned int rat_max_block_size; extern const unsigned int rat_block_sizes; extern const unsigned int rat_chunk_arr_inc; rat_block_allocator *rat_block_allocator_create(); void rat_block_allocator_destroy(rat_block_allocator *bal); void rat_block_allocator_clear(rat_block_allocator *bal); void *rat_block_alloc(rat_block_allocator *bal,size_t size); void *rat_block_realloc(rat_block_allocator *bal,void *mem,size_t oldsize,size_t size); void rat_block_dealloc(rat_block_allocator *bal,void *mem,size_t size); unsigned int rat_block_allocator_blocks_alloced(rat_block_allocator *bal); #ifdef __cplusplus } #endif #endif