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;