Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 861 → Rev 862

/kernel/branches/kolibri_pe/core/heap.c
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;