Rev 823 | Rev 839 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 823 | Rev 837 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 823 $ |
8 | $Revision: 837 $ |
9 | 9 | ||
10 | 10 | ||
Line 207... | Line 207... | ||
207 | test edi, edi |
207 | test edi, edi |
208 | jnz .check_size |
208 | jnz .check_size |
209 | .err: |
209 | .err: |
210 | xor edi, edi |
210 | xor edi, edi |
211 | ret |
211 | ret |
- | 212 | ; param |
|
- | 213 | ; eax= required size |
|
- | 214 | ; |
|
- | 215 | ; retval |
|
- | 216 | ; edi= memory block descriptor |
|
- | 217 | ; ebx= descriptor index |
|
- | 218 | align 4 |
|
- | 219 | get_large_block: |
|
- | 220 | mov edx, -1 |
|
- | 221 | mov ecx, eax |
|
- | 222 | shr ecx, 22 |
|
- | 223 | dec ecx |
|
- | 224 | cmp ecx, 31 |
|
- | 225 | jle .get_index |
|
- | 226 | mov ecx, 31 |
|
- | 227 | .get_index: |
|
- | 228 | shl edx, cl |
|
- | 229 | and edx, [large_block_mask] |
|
- | 230 | .find: |
|
- | 231 | bsf edi, edx |
|
- | 232 | mov ebx, edi |
|
- | 233 | mov edi, [large_block_list+edi*4] |
|
- | 234 | .check_size: |
|
- | 235 | cmp eax, [edi+block_size] |
|
- | 236 | ja .next |
|
- | 237 | ret |
|
- | 238 | .next: |
|
- | 239 | mov edi, [edi+list_fd] |
|
- | 240 | test edi, edi |
|
- | 241 | jnz .check_size |
|
- | 242 | .fail: |
|
- | 243 | xor edi, edi |
|
- | 244 | ret |
|
Line 212... | Line 245... | ||
212 | 245 | ||
213 | align 4 |
246 | align 4 |
Line 214... | Line 247... | ||
214 | alloc_mem_block: |
247 | alloc_mem_block: |
Line 637... | Line 670... | ||
637 | and [heap_mutex], 0 |
670 | and [heap_mutex], 0 |
638 | pop esi ebx |
671 | pop esi ebx |
639 | ret |
672 | ret |
640 | endp |
673 | endp |
Line -... | Line 674... | ||
- | 674 | ||
- | 675 | ||
- | 676 | align 4 |
|
- | 677 | proc alloc_large stdcall, size:dword |
|
- | 678 | local block_ind:DWORD |
|
- | 679 | ||
- | 680 | push ebx |
|
- | 681 | push esi |
|
- | 682 | push edi |
|
- | 683 | ||
- | 684 | mov eax, [size] |
|
- | 685 | add eax, 0x3FFFFF |
|
- | 686 | and eax, not 0x3FFFFF |
|
- | 687 | mov [size], eax |
|
- | 688 | ||
- | 689 | ; mov ebx, heap_mutex |
|
- | 690 | ; call wait_mutex ;ebx |
|
- | 691 | ||
- | 692 | ; cmp eax, [heap_free] |
|
- | 693 | ; ja .error |
|
- | 694 | ||
- | 695 | call get_large_block ; eax |
|
- | 696 | test edi, edi |
|
- | 697 | jz .error |
|
- | 698 | ||
- | 699 | cmp [edi+block_flags], FREE_BLOCK |
|
- | 700 | jne .error |
|
- | 701 | ||
- | 702 | mov [block_ind], ebx ;index of allocated block |
|
- | 703 | ||
- | 704 | mov eax, [edi+block_size] |
|
- | 705 | cmp eax, [size] |
|
- | 706 | je .m_eq_size |
|
- | 707 | ||
- | 708 | call alloc_mem_block |
|
- | 709 | and eax, eax |
|
- | 710 | jz .error |
|
- | 711 | ||
- | 712 | mov esi, eax ;esi - splitted block |
|
- | 713 | ||
- | 714 | mov [esi+block_next], edi |
|
- | 715 | mov eax, [edi+block_prev] |
|
- | 716 | mov [esi+block_prev], eax |
|
- | 717 | mov [edi+block_prev], esi |
|
- | 718 | mov [esi+list_fd], 0 |
|
- | 719 | mov [esi+list_bk], 0 |
|
- | 720 | test eax, eax |
|
- | 721 | jz @f |
|
- | 722 | mov [eax+block_next], esi |
|
- | 723 | @@: |
|
- | 724 | mov ebx, [edi+block_base] |
|
- | 725 | mov [esi+block_base], ebx |
|
- | 726 | mov edx, [size] |
|
- | 727 | mov [esi+block_size], edx |
|
- | 728 | add [edi+block_base], edx |
|
- | 729 | sub [edi+block_size], edx |
|
- | 730 | ||
- | 731 | mov eax, [edi+block_size] |
|
- | 732 | shr eax, 22 |
|
- | 733 | dec eax |
|
- | 734 | cmp eax, 31 |
|
- | 735 | jna @f |
|
- | 736 | mov eax, 31 |
|
- | 737 | @@: |
|
- | 738 | cmp eax, [block_ind] |
|
- | 739 | je .m_eq_ind |
|
- | 740 | ||
- | 741 | remove_from_list edi |
|
- | 742 | ||
- | 743 | mov ecx, [block_ind] |
|
- | 744 | mov [large_block_list+ecx*4], edx |
|
- | 745 | ||
- | 746 | test edx, edx |
|
- | 747 | jnz @f |
|
- | 748 | btr [large_block_mask], ecx |
|
- | 749 | @@: |
|
- | 750 | mov edx, [large_block_list+eax*4] |
|
- | 751 | mov [edi+list_fd], edx |
|
- | 752 | test edx, edx |
|
- | 753 | jz @f |
|
- | 754 | mov [edx+list_bk], edi |
|
- | 755 | @@: |
|
- | 756 | mov [large_block_list+eax*4], edi |
|
- | 757 | bts [large_block_mask], eax |
|
- | 758 | .m_eq_ind: |
|
- | 759 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
|
- | 760 | mov edx, [ecx+list_fd] |
|
- | 761 | mov [esi+list_fd], edx |
|
- | 762 | mov [esi+list_bk], ecx |
|
- | 763 | mov [ecx+list_fd], esi |
|
- | 764 | mov [edx+list_bk], esi |
|
- | 765 | ||
- | 766 | mov [esi+block_flags], USED_BLOCK |
|
- | 767 | mov eax, [esi+block_base] |
|
- | 768 | mov ebx, [size] |
|
- | 769 | sub [heap_free], ebx |
|
- | 770 | and [heap_mutex], 0 |
|
- | 771 | pop edi |
|
- | 772 | pop esi |
|
- | 773 | pop ebx |
|
- | 774 | ret |
|
- | 775 | .m_eq_size: |
|
- | 776 | remove_from_list edi |
|
- | 777 | mov [large_block_list+ebx*4], edx |
|
- | 778 | and edx, edx |
|
- | 779 | jnz @f |
|
- | 780 | btr [large_block_mask], ebx |
|
- | 781 | @@: |
|
- | 782 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
|
- | 783 | mov edx, [ecx+list_fd] |
|
- | 784 | mov [edi+list_fd], edx |
|
- | 785 | mov [edi+list_bk], ecx |
|
- | 786 | mov [ecx+list_fd], edi |
|
- | 787 | mov [edx+list_bk], edi |
|
- | 788 | ||
- | 789 | mov [edi+block_flags], USED_BLOCK |
|
- | 790 | mov eax, [edi+block_base] |
|
- | 791 | mov ebx, [size] |
|
- | 792 | sub [heap_free], ebx |
|
- | 793 | and [heap_mutex], 0 |
|
- | 794 | pop edi |
|
- | 795 | pop esi |
|
- | 796 | pop ebx |
|
- | 797 | ret |
|
- | 798 | .error: |
|
- | 799 | xor eax, eax |
|
- | 800 | mov [heap_mutex], eax |
|
- | 801 | pop edi |
|
- | 802 | pop esi |
|
- | 803 | pop ebx |
|
- | 804 | ret |
|
- | 805 | endp |
|
641 | 806 | ||
642 | restore block_next |
807 | restore block_next |
643 | restore block_prev |
808 | restore block_prev |
644 | restore block_list |
809 | restore block_list |
645 | restore block_base |
810 | restore block_base |