Mercurial > repos > rhope
comparison runtime/fixed_alloc.c @ 49:3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 08 Apr 2010 01:02:18 -0400 |
parents | a24eb366195c |
children | d1569087348f |
comparison
equal
deleted
inserted
replaced
48:a24eb366195c | 49:3e20ed8959c4 |
---|---|
35 block = manager->freelist; | 35 block = manager->freelist; |
36 if(block) | 36 if(block) |
37 { | 37 { |
38 --manager->freecount; | 38 --manager->freecount; |
39 manager->freelist = block->next; | 39 manager->freelist = block->next; |
40 memset(block, 0xCD, BLOCK_SIZE); | |
40 } | 41 } |
41 else | 42 else |
42 { | 43 { |
43 block = block_alloc(BLOCK_SIZE); | 44 block = block_alloc(BLOCK_SIZE); |
45 memset(block, 0xAB, BLOCK_SIZE); | |
44 } | 46 } |
45 manager->inuse[bucket] = block; | 47 manager->inuse[bucket] = block; |
46 block->next = NULL; | 48 block->next = NULL; |
47 block->last = NULL; | 49 block->last = NULL; |
48 block->numfree = max_free[bucket]; | 50 block->numfree = max_free[bucket]; |
77 manager->inuse[bucket] = block->next; | 79 manager->inuse[bucket] = block->next; |
78 if(block->next) | 80 if(block->next) |
79 block->next->last = block->last; | 81 block->next->last = block->last; |
80 } | 82 } |
81 i = i*8+bit; | 83 i = i*8+bit; |
82 //printf("%X\n", ((char *)block)+BLOCK_SIZE-((i+1)*size)); | |
83 return (void *)(((char *)block)+BLOCK_SIZE-((i+1)*size)); | 84 return (void *)(((char *)block)+BLOCK_SIZE-((i+1)*size)); |
84 } | 85 } |
85 | 86 |
86 void ffree(void * ptr, size_t size, mem_manager * manager) | 87 void ffree(void * ptr, size_t size, mem_manager * manager) |
87 { | 88 { |
92 free(ptr); | 93 free(ptr); |
93 return; | 94 return; |
94 } | 95 } |
95 //puts("ffree"); | 96 //puts("ffree"); |
96 size = ADJUST_SIZE(size); | 97 size = ADJUST_SIZE(size); |
98 memset(ptr, 0xEF, size); | |
97 block = GET_BLOCK(ptr); | 99 block = GET_BLOCK(ptr); |
98 i = (((((char *)block) + BLOCK_SIZE) - ((char *)ptr))/size)-1; | 100 i = (((((char *)block) + BLOCK_SIZE) - ((char *)ptr))/size)-1; |
99 bit = i & 0x7; | 101 bit = i & 0x7; |
100 i = (i&0xFFFFFFF8) >> 3; | 102 i = (i&0xFFFFFFF8) >> 3; |
101 //printf("ptr:%X,block:%X,i:%d,bit:%d\n", ptr,block,bit,i); | 103 //printf("ptr:%X,block:%X,i:%d,bit:%d\n", ptr,block,bit,i); |
118 else | 120 else |
119 manager->inuse[bucket] = block->next; | 121 manager->inuse[bucket] = block->next; |
120 if(block->next) | 122 if(block->next) |
121 block->next->last = block->last; | 123 block->next->last = block->last; |
122 if(manager->freecount == MAX_FREE) | 124 if(manager->freecount == MAX_FREE) |
125 { | |
123 block_free(block, BLOCK_SIZE); | 126 block_free(block, BLOCK_SIZE); |
127 } | |
124 else | 128 else |
125 { | 129 { |
126 block->next = manager->freelist; | 130 block->next = manager->freelist; |
127 manager->freelist = block; | 131 manager->freelist = block; |
128 ++manager->freecount; | 132 ++manager->freecount; |