Rev 3798 | Rev 4424 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3798 | Rev 4391 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. 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: 3798 $ |
8 | $Revision: 4391 $ |
9 | 9 | ||
10 | 10 | ||
Line 282... | Line 282... | ||
282 | mov [size], eax |
282 | mov [size], eax |
Line 283... | Line 283... | ||
283 | 283 | ||
284 | cmp eax, [heap_free] |
284 | cmp eax, [heap_free] |
Line 285... | Line 285... | ||
285 | ja .error |
285 | ja .error |
286 | - | ||
Line 287... | Line 286... | ||
287 | mov ecx, heap_mutex |
286 | |
Line 288... | Line 287... | ||
288 | call mutex_lock |
287 | spin_lock_irqsave heap_mutex |
289 | 288 | ||
Line 324... | Line 323... | ||
324 | mov [esi+block_size], edx |
323 | mov [esi+block_size], edx |
325 | add [edi+block_base], edx |
324 | add [edi+block_base], edx |
326 | sub [edi+block_size], edx |
325 | sub [edi+block_size], edx |
Line 327... | Line 326... | ||
327 | 326 | ||
328 | mov eax, [edi+block_size] |
327 | mov eax, [edi+block_size] |
329 | calc_index eax |
328 | calc_index eax |
330 | cmp eax, [block_ind] |
329 | cmp eax, [block_ind] |
Line 331... | Line 330... | ||
331 | je .add_used |
330 | je .add_used |
Line 332... | Line 331... | ||
332 | 331 | ||
333 | list_del edi |
332 | list_del edi |
334 | 333 | ||
335 | mov ecx, [block_ind] |
334 | mov ecx, [block_ind] |
336 | lea edx, [mem_block_list+ecx*8] |
335 | lea edx, [mem_block_list+ecx*8] |
337 | cmp edx, [edx] |
336 | cmp edx, [edx] |
338 | jnz @f |
337 | jnz @f |
339 | btr [mem_block_mask], ecx |
338 | btr [mem_block_mask], ecx |
340 | @@: |
339 | @@: |
341 | bts [mem_block_mask], eax |
340 | bts [mem_block_mask], eax |
Line 342... | Line 341... | ||
342 | lea edx, [mem_block_list+eax*8] ;edx= list head |
341 | lea edx, [mem_block_list+eax*8] ;edx= list head |
Line 343... | Line 342... | ||
343 | list_add edi, edx |
342 | list_add edi, edx |
344 | .add_used: |
- | |
345 | 343 | .add_used: |
|
346 | call md.add_to_used |
344 | |
347 | 345 | call md.add_to_used |
|
348 | mov ecx, heap_mutex |
346 | |
349 | call mutex_unlock |
347 | spin_unlock_irqrestore heap_mutex |
Line 350... | Line 348... | ||
350 | mov eax, [esi+block_base] |
348 | mov eax, [esi+block_base] |
351 | pop edi |
349 | pop edi |
352 | pop esi |
350 | pop esi |
353 | pop ebx |
351 | pop ebx |
354 | ret |
352 | ret |
355 | 353 | ||
356 | .m_eq_size: |
354 | .m_eq_size: |
357 | list_del edi |
355 | list_del edi |
358 | lea edx, [mem_block_list+ebx*8] |
356 | lea edx, [mem_block_list+ebx*8] |
Line 359... | Line 357... | ||
359 | cmp edx, [edx] |
357 | cmp edx, [edx] |
360 | jnz @f |
358 | jnz @f |
361 | btr [mem_block_mask], ebx |
- | |
362 | @@: |
359 | btr [mem_block_mask], ebx |
363 | mov esi, edi |
360 | @@: |
364 | jmp .add_used |
361 | mov esi, edi |
365 | 362 | jmp .add_used |
|
366 | .error_unlock: |
363 | |
Line 375... | Line 372... | ||
375 | endp |
372 | endp |
Line 376... | Line 373... | ||
376 | 373 | ||
377 | align 4 |
374 | align 4 |
Line 378... | Line 375... | ||
378 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
375 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
379 | - | ||
Line 380... | Line 376... | ||
380 | mov ecx, heap_mutex |
376 | |
Line 381... | Line 377... | ||
381 | call mutex_lock |
377 | spin_lock_irqsave heap_mutex |
382 | 378 | ||
Line 444... | Line 440... | ||
444 | .add_block: |
440 | .add_block: |
445 | bts [mem_block_mask], eax |
441 | bts [mem_block_mask], eax |
446 | lea edx, [mem_block_list+eax*8] |
442 | lea edx, [mem_block_list+eax*8] |
447 | list_add edi, edx |
443 | list_add edi, edx |
448 | .m_eq: |
444 | .m_eq: |
449 | mov ecx, heap_mutex |
445 | spin_unlock_irqrestore heap_mutex |
450 | call mutex_unlock |
- | |
451 | xor eax, eax |
446 | xor eax, eax |
452 | not eax |
447 | not eax |
453 | ret |
448 | ret |
454 | .insert: |
449 | .insert: |
455 | mov [esi+block_flags], FREE_BLOCK |
450 | mov [esi+block_flags], FREE_BLOCK |
Line 457... | Line 452... | ||
457 | calc_index eax |
452 | calc_index eax |
458 | mov edi, esi |
453 | mov edi, esi |
459 | jmp .add_block |
454 | jmp .add_block |
Line 460... | Line 455... | ||
460 | 455 | ||
461 | .fail: |
456 | .fail: |
462 | mov ecx, heap_mutex |
- | |
463 | call mutex_unlock |
457 | spin_unlock_irqrestore heap_mutex |
464 | xor eax, eax |
458 | xor eax, eax |
465 | ret |
459 | ret |
Line 466... | Line 460... | ||
466 | endp |
460 | endp |
Line 542... | Line 536... | ||
542 | align 4 |
536 | align 4 |
543 | proc kernel_free stdcall, base:dword |
537 | proc kernel_free stdcall, base:dword |
Line 544... | Line 538... | ||
544 | 538 | ||
Line 545... | Line 539... | ||
545 | push ebx esi |
539 | push ebx esi |
546 | - | ||
Line 547... | Line 540... | ||
547 | mov ecx, heap_mutex |
540 | |
548 | call mutex_lock |
541 | spin_lock_irqsave heap_mutex |
Line 549... | Line -... | ||
549 | - | ||
550 | mov eax, [base] |
542 | |
551 | call md.find_used |
543 | mov eax, [base] |
Line 552... | Line 544... | ||
552 | 544 | call md.find_used |
|
Line 553... | Line 545... | ||
553 | mov ecx, heap_mutex |
545 | |
554 | cmp [esi+block_flags], USED_BLOCK |
546 | cmp [esi+block_flags], USED_BLOCK |
555 | jne .fail |
547 | jne .fail |
556 | 548 | ||
557 | call mutex_unlock |
549 | spin_unlock_irqrestore heap_mutex |
558 | 550 | ||
559 | mov eax, [esi+block_base] |
551 | mov eax, [esi+block_base] |
560 | mov ecx, [esi+block_size] |
552 | mov ecx, [esi+block_size] |
561 | shr ecx, 12 |
553 | shr ecx, 12 |
562 | call release_pages ;eax, ecx |
554 | call release_pages ;eax, ecx |
563 | stdcall free_kernel_space, [base] |
555 | stdcall free_kernel_space, [base] |
564 | pop esi ebx |
556 | pop esi ebx |
565 | ret |
557 | ret |