Mercurial > repos > rhope
annotate runtime/fixed_alloc.c @ 75:0083b2f7b3c7
Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 06 Jul 2010 07:52:59 -0400 |
parents | d1569087348f |
children | 5a195ee08eac |
rev | line source |
---|---|
41
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include "fixed_alloc.h" |
67 | 2 #include <stdlib.h> |
48
a24eb366195c
Fixed some bugs introduced in previous commit and moved definition of integer methods out of runtime and into the compiler
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
3 #include <string.h> |
41
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 uint16_t max_free[(MAX_SIZE-MIN_SIZE)/STRIDE]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 void fixed_alloc_init() |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 int i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 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
|
11 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
|
12 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 mem_manager * new_mem_manager() |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 int i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 mem_manager * ret = malloc(sizeof(mem_manager)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 memset(ret, 0, sizeof(mem_manager)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 return ret; |
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 |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 void * falloc(size_t size, mem_manager * manager) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 uint16_t i,bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 uint16_t bucket; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 mem_block * block,*temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 if(size > MAX_SIZE) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 return malloc(size); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 //puts("falloc"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 size = ADJUST_SIZE(size); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 bucket = (size-MIN_SIZE)/STRIDE; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 block = manager->inuse[bucket]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 if(!block) |
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 block = manager->freelist; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 if(block) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 --manager->freecount; |
67 | 39 manager->freelist = block->next; |
40 //memset(block, 0xCD, BLOCK_SIZE); | |
41
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 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 { |
67 | 44 block = block_alloc(BLOCK_SIZE); |
45 //memset(block, 0xAB, BLOCK_SIZE); | |
41
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 manager->inuse[bucket] = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 block->next = NULL; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 block->last = NULL; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 block->numfree = max_free[bucket]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 block->firstfree = 0; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 memset(block->bitmap, 0xFF, max_free[bucket]/8+1); |
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 //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
|
55 /*if(block->numfree > max_free[bucket]) |
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 puts("uh oh!"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 exit(1); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 }*/ |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 //find first free |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 i = block->firstfree; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 while(!block->bitmap[i]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 ++i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 //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
|
65 bit = 0; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 while(!((1 << bit) & block->bitmap[i])) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 ++bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 //update free bitmask |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 block->bitmap[i] ^= 1 << bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 //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
|
71 if(!block->bitmap[i]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 block->firstfree = i+1; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 block->firstfree = i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 --block->numfree; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 if(!block->numfree) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 //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
|
79 manager->inuse[bucket] = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 block->next->last = block->last; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 i = i*8+bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 return (void *)(((char *)block)+BLOCK_SIZE-((i+1)*size)); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 } |
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 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
|
88 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 mem_block * block,*temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 uint16_t i,bit,bucket; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 if(size > MAX_SIZE) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 free(ptr); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 return; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 //puts("ffree"); |
67 | 97 size = ADJUST_SIZE(size); |
98 //memset(ptr, 0xEF, size); | |
41
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 block = GET_BLOCK(ptr); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 i = (((((char *)block) + BLOCK_SIZE) - ((char *)ptr))/size)-1; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 bit = i & 0x7; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 i = (i&0xFFFFFFF8) >> 3; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 //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
|
104 block->bitmap[i] |= 1 << bit; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 if(i < block->firstfree) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 block->firstfree = i; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 ++block->numfree; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 bucket = (size-MIN_SIZE)/STRIDE; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 //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
|
110 /*if(block->numfree > max_free[bucket]) |
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 puts("uh oh!"); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
113 exit(1); |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 }*/ |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 if(block->numfree == max_free[bucket]) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 //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
|
118 if(block->last) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 block->last->next = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 manager->inuse[bucket] = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 block->next->last = block->last; |
67 | 124 if(manager->freecount == MAX_FREE) |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
48
diff
changeset
|
125 { |
67 | 126 block_free(block, BLOCK_SIZE); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
48
diff
changeset
|
127 } |
41
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 block->next = manager->freelist; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 manager->freelist = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 ++manager->freecount; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 } else if(block->numfree == 1) { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 //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
|
136 block->next = manager->inuse[bucket]; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 block->last = NULL; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 manager->inuse[bucket] = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 block->next->last = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 } else if(block->next && block->next->numfree < block->numfree) { |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 //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
|
143 //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
|
144 //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
|
145 //next one swap them |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 temp = block->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 block->next = temp->next; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 temp->last = block->last; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 block->last = temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 temp->next = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 if(block->next) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 block->next->last = block; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 if(temp->last) |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 temp->last->next = temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 else |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 manager->inuse[bucket] = temp; |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
157 } |
1b86a1ee500a
Added faster allocator for small objects
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
158 } |