annotate runtime/fixed_alloc.h @ 41:1b86a1ee500a

Added faster allocator for small objects
author Mike Pavone <pavone@retrodev.com>
date Sat, 10 Oct 2009 16:40:50 -0400
parents
children a24eb366195c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #ifndef FIXED_ALLOC_H_
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #define FIXED_ALLOC_H_
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include <stddef.h>
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "plat_types.h"
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "block_alloc.h"
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #define GET_BLOCK(ptr) ((void*)(((uint32_t)(ptr))&(~(BLOCK_SIZE-1))))
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #define MAX_SIZE (BLOCK_SIZE/32)
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #define STRIDE (BLOCK_SIZE/1024)
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 #define MIN_SIZE (BLOCK_SIZE/1024)
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #define MAX_FREE 16
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15 #define ADJUST_SIZE(requested) (((requested)+(STRIDE-1)) & (~(STRIDE-1)))
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 #pragma pack(push,1)
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 typedef struct mem_block {
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 struct mem_block *next;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 struct mem_block *last;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 uint16_t numfree;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 uint16_t firstfree;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 uint8_t bitmap[1];
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 } mem_block;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 #pragma pack(pop)
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 //num_elements = (BLOCK_SIZE - sizeof(mem_block)+1)*8/(sizeof(element)*8+1)
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 typedef struct {
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 mem_block *freelist;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 mem_block *inuse[(MAX_SIZE-MIN_SIZE)/STRIDE];
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 uint32_t freecount;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 } mem_manager;
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 void fixed_alloc_init();
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 mem_manager * new_mem_manager();
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 void * falloc(size_t size, mem_manager * manager);
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 void ffree(void * ptr, size_t size, mem_manager * manager);
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39
1b86a1ee500a Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 #endif //FIXED_ALLOC_H_