view runtime/fixed_alloc.h @ 105:43cc42df26cc

Various compiler improvements
author Mike Pavone <pavone@retrodev.com>
date Tue, 24 Aug 2010 23:22:17 -0400
parents f4fd8962c385
children 72c648bca43b
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);

#endif //FIXED_ALLOC_H_