Mercurial > repos > rhope
comparison runtime/fixed_alloc.c @ 63:04baa003de5a
Merged latest changes with better C branch
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 05 May 2010 22:12:23 -0400 |
parents | 3e20ed8959c4 |
children | d1569087348f |
comparison
equal
deleted
inserted
replaced
62:b218af069da7 | 63:04baa003de5a |
---|---|
1 #include "fixed_alloc.h" | 1 #include "fixed_alloc.h" |
2 #include <stdlib.h> | 2 #include <stdlib.h> |
3 #include <string.h> | |
3 | 4 |
4 uint16_t max_free[(MAX_SIZE-MIN_SIZE)/STRIDE]; | 5 uint16_t max_free[(MAX_SIZE-MIN_SIZE)/STRIDE]; |
5 | 6 |
6 void fixed_alloc_init() | 7 void fixed_alloc_init() |
7 { | 8 { |
34 block = manager->freelist; | 35 block = manager->freelist; |
35 if(block) | 36 if(block) |
36 { | 37 { |
37 --manager->freecount; | 38 --manager->freecount; |
38 manager->freelist = block->next; | 39 manager->freelist = block->next; |
40 memset(block, 0xCD, BLOCK_SIZE); | |
39 } | 41 } |
40 else | 42 else |
41 { | 43 { |
42 block = block_alloc(BLOCK_SIZE); | 44 block = block_alloc(BLOCK_SIZE); |
45 memset(block, 0xAB, BLOCK_SIZE); | |
43 } | 46 } |
44 manager->inuse[bucket] = block; | 47 manager->inuse[bucket] = block; |
45 block->next = NULL; | 48 block->next = NULL; |
46 block->last = NULL; | 49 block->last = NULL; |
47 block->numfree = max_free[bucket]; | 50 block->numfree = max_free[bucket]; |
76 manager->inuse[bucket] = block->next; | 79 manager->inuse[bucket] = block->next; |
77 if(block->next) | 80 if(block->next) |
78 block->next->last = block->last; | 81 block->next->last = block->last; |
79 } | 82 } |
80 i = i*8+bit; | 83 i = i*8+bit; |
81 //printf("%X\n", ((char *)block)+BLOCK_SIZE-((i+1)*size)); | |
82 return (void *)(((char *)block)+BLOCK_SIZE-((i+1)*size)); | 84 return (void *)(((char *)block)+BLOCK_SIZE-((i+1)*size)); |
83 } | 85 } |
84 | 86 |
85 void ffree(void * ptr, size_t size, mem_manager * manager) | 87 void ffree(void * ptr, size_t size, mem_manager * manager) |
86 { | 88 { |
91 free(ptr); | 93 free(ptr); |
92 return; | 94 return; |
93 } | 95 } |
94 //puts("ffree"); | 96 //puts("ffree"); |
95 size = ADJUST_SIZE(size); | 97 size = ADJUST_SIZE(size); |
98 memset(ptr, 0xEF, size); | |
96 block = GET_BLOCK(ptr); | 99 block = GET_BLOCK(ptr); |
97 i = (((((char *)block) + BLOCK_SIZE) - ((char *)ptr))/size)-1; | 100 i = (((((char *)block) + BLOCK_SIZE) - ((char *)ptr))/size)-1; |
98 bit = i & 0x7; | 101 bit = i & 0x7; |
99 i = (i&0xFFFFFFF8) >> 3; | 102 i = (i&0xFFFFFFF8) >> 3; |
100 //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); |
117 else | 120 else |
118 manager->inuse[bucket] = block->next; | 121 manager->inuse[bucket] = block->next; |
119 if(block->next) | 122 if(block->next) |
120 block->next->last = block->last; | 123 block->next->last = block->last; |
121 if(manager->freecount == MAX_FREE) | 124 if(manager->freecount == MAX_FREE) |
125 { | |
122 block_free(block, BLOCK_SIZE); | 126 block_free(block, BLOCK_SIZE); |
127 } | |
123 else | 128 else |
124 { | 129 { |
125 block->next = manager->freelist; | 130 block->next = manager->freelist; |
126 manager->freelist = block; | 131 manager->freelist = block; |
127 ++manager->freecount; | 132 ++manager->freecount; |