Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 860 → Rev 861

/kernel/branches/kolibri_pe/core/heap.c
110,7 → 110,7
md_t *new_md = (md_t*)slab_alloc(md_slab,0);
 
link_initialize(&new_md->link);
list_insert(&md->adj, &new_md->adj);
list_insert(&new_md->adj, &md->adj);
 
new_md->base = md->base;
new_md->size = size;
144,19 → 144,34
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);
 
if(mask)
{
md_t *tmp;
 
idx0 = _bsf(mask);
 
ASSERT( !list_empty(&sheap.list[idx0]))
 
md = (md_t*)sheap.list[idx0].next;
tmp = (md_t*)sheap.list[idx0].next;
 
list_remove((link_t*)md);
while((link_t*)tmp != &sheap.list[idx0])
{
if(tmp->size >= size)
{
//printf("remove tmp %x\n", tmp);
list_remove((link_t*)tmp);
if(list_empty(&sheap.list[idx0]))
_reset_smask(idx0);
}
else
md = tmp;
break;
};
tmp = (md_t*)tmp->link.next;
};
};
 
if( !md)
{
md_t *lmd;
lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF);
181,7 → 196,7
md_t *new_md = (md_t*)slab_alloc(md_slab,0);
 
link_initialize(&new_md->link);
list_insert(&md->adj, &new_md->adj);
list_insert(&new_md->adj, &md->adj);
 
new_md->base = md->base;
new_md->size = size;
191,9 → 206,30
md->base+= size;
md->size-= size;
 
idx1 = (md->size>>22) - 1 < 32 ? (md->size>>22) - 1 : 31;
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);
 
if( idx1 < 31)
list_prepend(&md->link, &sheap.list[idx1]);
else
{
if( list_empty(&sheap.list[31]))
list_prepend(&md->link, &sheap.list[31]);
else
{
md_t *tmp = (md_t*)sheap.list[31].next;
 
while((link_t*)tmp != &sheap.list[31])
{
if(md->base < tmp->base)
break;
tmp = (md_t*)tmp->link.next;
}
list_insert(&md->link, &tmp->link);
};
};
 
_set_smask(idx1);
 
safe_sti(efl);
282,6 → 318,8
size = (size+4095)&~4095;
 
md = find_small_md(size);
 
// printf("alloc_kernel_space: %x size %x\n\n",md->base, size);
if( md )
return (void*)md->base;
return NULL;