Mercurial > repos > rhope
annotate runtime/fixed_alloc.c @ 62:b218af069da7
merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 10 Oct 2009 16:43:37 -0400 |
parents | 1b86a1ee500a |
children | a24eb366195c |
rev | line source |
---|---|
41
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include "fixed_alloc.h" |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stdlib.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 uint16_t max_free[(MAX_SIZE-MIN_SIZE)/STRIDE]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 void fixed_alloc_init() |
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 int i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 for(i = 0; i < (MAX_SIZE-MIN_SIZE)/STRIDE; ++i) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 max_free[i] = (BLOCK_SIZE - sizeof(mem_block)+1)*8/((i*STRIDE+MIN_SIZE)*8+1); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 mem_manager * new_mem_manager() |
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 int i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 mem_manager * ret = malloc(sizeof(mem_manager)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 memset(ret, 0, sizeof(mem_manager)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 return ret; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 void * falloc(size_t size, mem_manager * manager) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 uint16_t i,bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 uint16_t bucket; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 mem_block * block,*temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 if(size > MAX_SIZE) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 return malloc(size); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 //puts("falloc"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 size = ADJUST_SIZE(size); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 bucket = (size-MIN_SIZE)/STRIDE; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 block = manager->inuse[bucket]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 if(!block) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 block = manager->freelist; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 if(block) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 --manager->freecount; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 manager->freelist = block->next; |
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 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 block = block_alloc(BLOCK_SIZE); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 manager->inuse[bucket] = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 block->next = NULL; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 block->last = NULL; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 block->numfree = max_free[bucket]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 block->firstfree = 0; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 memset(block->bitmap, 0xFF, max_free[bucket]/8+1); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 //printf("block: %X,numfree: %d, firstfree: %d, maxfree: %d\n", block, block->numfree, block->firstfree, max_free[bucket]); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 /*if(block->numfree > max_free[bucket]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 puts("uh oh!"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 exit(1); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 }*/ |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 //find first free |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 i = block->firstfree; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 while(!block->bitmap[i]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 ++i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 //printf("i:%d,bitmap:%X\n", i, block->bitmap[i]); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 bit = 0; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 while(!((1 << bit) & block->bitmap[i])) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 ++bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 //update free bitmask |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 block->bitmap[i] ^= 1 << bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 //If current bitmap has no more free elements, set firstfree to the next bitmap |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 if(!block->bitmap[i]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 block->firstfree = i+1; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 block->firstfree = i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 --block->numfree; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 if(!block->numfree) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 //Remove from linked list if there are no more free elements |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 manager->inuse[bucket] = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 block->next->last = block->last; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 i = i*8+bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 //printf("%X\n", ((char *)block)+BLOCK_SIZE-((i+1)*size)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 return (void *)(((char *)block)+BLOCK_SIZE-((i+1)*size)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 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
|
86 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 mem_block * block,*temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 uint16_t i,bit,bucket; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 if(size > MAX_SIZE) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 free(ptr); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 return; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 //puts("ffree"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 size = ADJUST_SIZE(size); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 block = GET_BLOCK(ptr); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 i = (((((char *)block) + BLOCK_SIZE) - ((char *)ptr))/size)-1; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 bit = i & 0x7; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 i = (i&0xFFFFFFF8) >> 3; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 //printf("ptr:%X,block:%X,i:%d,bit:%d\n", ptr,block,bit,i); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 block->bitmap[i] |= 1 << bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 if(i < block->firstfree) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 block->firstfree = i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 ++block->numfree; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 bucket = (size-MIN_SIZE)/STRIDE; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 //printf("numfree:%d,max_free:%d,last:%X,next:%X\n", block->numfree, max_free[bucket], block->last, block->next); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 /*if(block->numfree > max_free[bucket]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 puts("uh oh!"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 exit(1); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 }*/ |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 if(block->numfree == max_free[bucket]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
113 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 //Block is now unused, remove it from the inuse list |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 if(block->last) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 block->last->next = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
118 manager->inuse[bucket] = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 block->next->last = block->last; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 if(manager->freecount == MAX_FREE) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 block_free(block, BLOCK_SIZE); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
124 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
125 block->next = manager->freelist; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 manager->freelist = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 ++manager->freecount; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 } else if(block->numfree == 1) { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 //Block was previously full, add it to the inuse list |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 block->next = manager->inuse[bucket]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 block->last = NULL; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 manager->inuse[bucket] = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 block->next->last = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
136 } else if(block->next && block->next->numfree < block->numfree) { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 //We want to use more filled blockes before less filled ones |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 //so we can return empty ones to the OS more often |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 //so if we now have more free nodes in this block than the |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 //next one swap them |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 temp = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 block->next = temp->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 temp->last = block->last; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
144 block->last = temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 temp->next = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 block->next->last = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 if(temp->last) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 temp->last->next = temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 manager->inuse[bucket] = temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 } |