Mercurial > repos > rhope
view runtime/fixed_alloc.h @ 174:0c7c5671fcd3
Start work on interpreter
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 19 May 2011 23:30:07 -0700 |
parents | 72c648bca43b |
children |
line wrap: on
line source
#ifndef FIXED_ALLOC_H_ #define FIXED_ALLOC_H_ #include <stddef.h> #include "plat_types.h" #include "block_alloc.h" #define GET_BLOCK(ptr) ((void*)(((uintptr_t)(ptr))&(~((uintptr_t)(BLOCK_SIZE-1))))) #define MAX_SIZE (BLOCK_SIZE/32) #ifndef STRIDE #define STRIDE (BLOCK_SIZE/1024) #endif #ifndef MIN_SIZE #define MIN_SIZE (BLOCK_SIZE/1024) #endif #ifndef MAX_FREE #define MAX_FREE 64 #endif #define ADJUST_SIZE(requested) (((requested)+(STRIDE-1)) & (~(STRIDE-1))) #pragma pack(push,1) typedef struct mem_block { struct mem_block *next; struct mem_block *last; uint16_t numfree; uint16_t firstfree; uint8_t bitmap[1]; } mem_block; #pragma pack(pop) //num_elements = (BLOCK_SIZE - sizeof(mem_block)+1)*8/(sizeof(element)*8+1) typedef struct { mem_block *freelist; mem_block *inuse[(MAX_SIZE-MIN_SIZE)/STRIDE+1]; uint32_t freecount; uint32_t fullcount; } mem_manager; void fixed_alloc_init(); mem_manager * new_mem_manager(); void * falloc(size_t size, mem_manager * manager); void ffree(void * ptr, size_t size, mem_manager * manager); void print_mem_info(mem_manager * manager); void print_live_object_types(mem_manager * manager); void find_live_objects_oftype(mem_manager * manager, int32_t type_id, void ** output); void get_live_object_counts(mem_manager * manager, int32_t * counts); #endif //FIXED_ALLOC_H_