49,8 → 49,8 |
|
ASSERT(base != 0); |
ASSERT(size != 0) |
ASSERT(base & 0x3FFFFF == 0); |
ASSERT(size & 0x3FFFFF == 0); |
ASSERT((base & 0x3FFFFF) == 0); |
ASSERT((size & 0x3FFFFF) == 0); |
|
for (i = 0; i < 32; i++) |
{ |
84,7 → 84,7 |
count_t idx0; |
u32_t mask; |
|
ASSERT(size & 0x3FFFFF == 0); |
ASSERT((size & 0x3FFFFF) == 0); |
|
idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31; |
mask = lheap.availmask & ( -1<<idx0 ); |
91,11 → 91,29 |
|
if(mask) |
{ |
if(idx0 == 31) |
{ |
md_t *tmp = (md_t*)lheap.list[31].next; |
while((link_t*)tmp != &lheap.list[31]) |
{ |
if(tmp->size >= size) |
{ |
DBG("remove large tmp %x\n", tmp); |
|
md = tmp; |
break; |
}; |
}; |
tmp = (md_t*)tmp->link.next; |
} |
else |
{ |
idx0 = _bsf(mask); |
|
ASSERT( !list_empty(&lheap.list[idx0])) |
|
md = (md_t*)lheap.list[idx0].next; |
}; |
} |
else |
return NULL; |
137,7 → 155,7 |
count_t idx0; |
u32_t mask; |
|
ASSERT(size & 0xFFF == 0); |
ASSERT((size & 0xFFF) == 0); |
|
efl = safe_cli(); |
|
144,37 → 162,46 |
idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31; |
mask = sheap.availmask & ( -1<<idx0 ); |
|
//printf("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask); |
DBG("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask); |
|
if(mask) |
{ |
md_t *tmp; |
|
idx0 = _bsf(mask); |
|
ASSERT( !list_empty(&sheap.list[idx0])) |
|
tmp = (md_t*)sheap.list[idx0].next; |
|
while((link_t*)tmp != &sheap.list[idx0]) |
if(idx0 == 31) |
{ |
md_t *tmp = (md_t*)sheap.list[31].next; |
while((link_t*)tmp != &sheap.list[31]) |
{ |
if(tmp->size >= size) |
{ |
//printf("remove tmp %x\n", tmp); |
list_remove((link_t*)tmp); |
if(list_empty(&sheap.list[idx0])) |
_reset_smask(idx0); |
md = tmp; |
break; |
}; |
tmp = (md_t*)tmp->link.next; |
}; |
} |
else |
{ |
idx0 = _bsf(mask); |
ASSERT( !list_empty(&sheap.list[idx0])) |
md = (md_t*)sheap.list[idx0].next; |
} |
}; |
|
if( !md) |
if(md) |
{ |
DBG("remove md %x\n", md); |
|
list_remove((link_t*)md); |
if(list_empty(&sheap.list[idx0])) |
_reset_smask(idx0); |
} |
else |
{ |
md_t *lmd; |
lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF); |
|
DBG("get large md %x\n", lmd); |
|
if( !lmd) |
{ |
safe_sti(efl); |
208,7 → 235,7 |
|
idx1 = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
|
//printf("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
DBG("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
|
if( idx1 < 31) |
list_prepend(&md->link, &sheap.list[idx1]); |
319,7 → 346,8 |
|
md = find_small_md(size); |
|
// printf("alloc_kernel_space: %x size %x\n\n",md->base, size); |
DBG("alloc_kernel_space: %x size %x\n\n",md->base, size); |
|
if( md ) |
return (void*)md->base; |
return NULL; |