Subversion Repositories Kolibri OS

Rev

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