46,16 → 46,68 |
@@: |
} |
|
macro remove_from_used op |
{ |
mov edx, [op+list_fd] |
mov ecx, [op+list_bk] |
mov [edx+list_bk], ecx |
mov [ecx+list_fd], edx |
mov [op+list_fd], 0 |
mov [op+list_bk], 0 |
} |
align 4 |
md: |
.add_to_used: |
mov eax, [esi+block_base] |
mov ebx, [esi+block_base] |
shr ebx, 6 |
add eax, ebx |
shr ebx, 6 |
add eax, ebx |
shr eax, 12 |
and eax, 63 |
inc [mem_hash_cnt+eax*4] |
|
lea ecx, [mem_used_list+eax*8] |
list_add esi, ecx |
mov [esi+block_flags], USED_BLOCK |
mov eax, [esi+block_size] |
sub [heap_free], eax |
ret |
align 4 |
.find_used: |
mov ecx, eax |
mov ebx, eax |
shr ebx, 6 |
add ecx, ebx |
shr ebx, 6 |
add ecx, ebx |
shr ecx, 12 |
and ecx, 63 |
|
lea ebx, [mem_used_list+ecx*8] |
mov esi, ebx |
.next: |
mov esi, [esi+list_fd] |
cmp esi, ebx |
je .fail |
|
cmp eax, [esi+block_base] |
jne .next |
|
ret |
.fail: |
xor esi, esi |
ret |
|
align 4 |
.del_from_used: |
call .find_used |
test esi, esi |
jz .done |
|
cmp [esi+block_flags], USED_BLOCK |
jne .fatal |
|
dec [mem_hash_cnt+ecx*4] |
list_del esi |
.done: |
ret |
.fatal: ;FIXME panic here |
xor esi, esi |
ret |
|
;Initial heap state |
; |
;+heap_size terminator USED_BLOCK |
74,9 → 126,13 |
stosd |
loop @B |
|
mov eax, mem_used.fd |
mov [mem_used.fd], eax |
mov [mem_used.bk], eax |
mov ecx, 64 |
mov edi, mem_used_list |
@@: |
mov eax, edi |
stosd |
stosd |
loop @B |
|
stdcall alloc_pages, dword 32 |
mov ecx, 32 |
139,7 → 195,6 |
|
mov [eax-MEM_BLOCK.sizeof], dword 0 |
|
|
mov ecx, heap_mutex |
call mutex_init |
mov [heap_blocks], 4094 |
279,7 → 334,7 |
mov eax, [edi+block_size] |
calc_index eax |
cmp eax, [block_ind] |
je .m_eq_ind |
je .add_used |
|
list_del edi |
|
292,17 → 347,10 |
bts [mem_block_mask], eax |
lea edx, [mem_block_list+eax*8] ;edx= list head |
list_add edi, edx |
.m_eq_ind: |
mov ecx, mem_used.fd |
mov edx, [ecx+list_fd] |
mov [esi+list_fd], edx |
mov [esi+list_bk], ecx |
mov [ecx+list_fd], esi |
mov [edx+list_bk], esi |
.add_used: |
|
mov [esi+block_flags], USED_BLOCK |
mov ebx, [size] |
sub [heap_free], ebx |
call md.add_to_used |
|
mov ecx, heap_mutex |
call mutex_unlock |
mov eax, [esi+block_base] |
310,6 → 358,7 |
pop esi |
pop ebx |
ret |
|
.m_eq_size: |
list_del edi |
lea edx, [mem_block_list+ebx*8] |
317,24 → 366,9 |
jnz @f |
btr [mem_block_mask], ebx |
@@: |
mov ecx, mem_used.fd |
mov edx, [ecx+list_fd] |
mov [edi+list_fd], edx |
mov [edi+list_bk], ecx |
mov [ecx+list_fd], edi |
mov [edx+list_bk], edi |
mov esi, edi |
jmp .add_used |
|
mov [edi+block_flags], USED_BLOCK |
mov ebx, [size] |
sub [heap_free], ebx |
mov ecx, heap_mutex |
call mutex_unlock |
mov eax, [edi+block_base] |
pop edi |
pop esi |
pop ebx |
ret |
|
.error_unlock: |
mov ecx, heap_mutex |
call mutex_unlock |
353,18 → 387,10 |
call mutex_lock |
|
mov eax, [base] |
mov esi, [mem_used.fd] |
@@: |
cmp esi, mem_used.fd |
je .fail |
|
cmp [esi+block_base], eax |
je .found |
mov esi, [esi+list_fd] |
jmp @b |
.found: |
cmp [esi+block_flags], USED_BLOCK |
jne .fail |
call md.del_from_used |
test esi, esi |
jz .fail |
|
mov eax, [esi+block_size] |
add [heap_free], eax |
395,8 → 421,6 |
cmp [edi+block_flags], FREE_BLOCK |
jne .insert |
|
remove_from_used esi |
|
mov edx, [esi+block_next] |
mov [edi+block_next], edx |
mov [edx+block_prev], edi |
433,7 → 457,6 |
not eax |
ret |
.insert: |
remove_from_used esi |
mov [esi+block_flags], FREE_BLOCK |
mov eax, [esi+block_size] |
calc_index eax |
523,6 → 546,7 |
|
align 4 |
proc kernel_free stdcall, base:dword |
|
push ebx esi |
|
mov ecx, heap_mutex |
529,16 → 553,9 |
call mutex_lock |
|
mov eax, [base] |
mov esi, [mem_used.fd] |
@@: |
cmp esi, mem_used.fd |
je .fail |
call md.find_used |
|
cmp [esi+block_base], eax |
je .found |
mov esi, [esi+list_fd] |
jmp @b |
.found: |
mov ecx, heap_mutex |
cmp [esi+block_flags], USED_BLOCK |
jne .fail |
|