Subversion Repositories Kolibri OS

Rev

Rev 2466 | Rev 2595 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2466 Rev 2594
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: 2466 $
8
$Revision: 2594 $
9
 
9
 
Line 440... Line 440...
440
endp
440
endp
Line 441... Line 441...
441
 
441
 
442
align 4
442
align 4
Line -... Line 443...
-
 
443
proc new_mem_resize stdcall, new_size:dword
-
 
444
 
-
 
445
        push    ebx
-
 
446
        push    esi
443
proc new_mem_resize stdcall, new_size:dword
447
        push    edi
-
 
448
 
444
 
449
        mov     edx, [current_slot]
Line 445... Line 450...
445
        mov     ecx, pg_data.mutex
450
        cmp     [edx+APPDATA.heap_base], 0
446
        call    mutex_lock
451
        jne     .exit
447
 
452
 
448
        mov     edi, [new_size]
453
        mov     edi, [new_size]
Line 449... Line -...
449
        add     edi, 4095
-
 
450
        and     edi, not 4095
-
 
451
        mov     [new_size], edi
-
 
452
 
-
 
453
        mov     edx, [current_slot]
454
        add     edi, 4095
454
        cmp     [edx+APPDATA.heap_base], 0
455
        and     edi, not 4095
455
        jne     .exit
456
        mov     [new_size], edi
Line 456... Line 457...
456
 
457
 
457
        mov     esi, [edx+APPDATA.mem_size]
458
        mov     esi, [edx+APPDATA.mem_size]
-
 
459
        add     esi, 4095
Line -... Line 460...
-
 
460
        and     esi, not 4095
458
        add     esi, 4095
461
 
459
        and     esi, not 4095
462
        cmp     edi, esi
-
 
463
        ja      .expand
-
 
464
        je      .exit
-
 
465
 
460
 
466
        mov     ebx, edi
461
        cmp     edi, esi
467
        shr     edi, 12
462
        jae     .expand
468
        shr     esi, 12
463
 
469
 
-
 
470
        mov     ecx, pg_data.mutex
464
        shr     edi, 12
471
        call    mutex_lock
465
        shr     esi, 12
-
 
466
@@:
-
 
467
        mov     eax, [app_page_tabs+edi*4]
-
 
468
        test    eax, 1
472
@@:
469
        jz      .next
-
 
470
        mov     dword [app_page_tabs+edi*4], 2
473
        mov     eax, [app_page_tabs+edi*4]
Line 471... Line 474...
471
        mov     ebx, edi
474
        test    eax, 1
472
        shl     ebx, 12
475
        jz      .next
473
        push    eax
476
 
474
        invlpg  [ebx]
477
        mov     dword [app_page_tabs+edi*4], 0
Line 475... Line -...
475
        pop     eax
-
 
476
        call    free_page
-
 
477
 
-
 
478
.next:
-
 
479
        add     edi, 1
478
        invlpg  [ebx]
480
        cmp     edi, esi
479
        call    free_page
Line -... Line 480...
-
 
480
 
-
 
481
.next:
-
 
482
        inc     edi
-
 
483
        cmp     edi, esi
-
 
484
        jb      @B
-
 
485
 
-
 
486
        mov     ecx, pg_data.mutex
-
 
487
        call    mutex_unlock
481
        jb      @B
488
 
482
 
489
.update_size:
-
 
490
        mov     edx, [current_slot]
483
.update_size:
491
        mov     ebx, [new_size]
Line -... Line 492...
-
 
492
        call    update_mem_size
484
        mov     ebx, [new_size]
493
.exit:
-
 
494
        pop     edi
485
        call    update_mem_size
495
        pop     esi
-
 
496
        pop     ebx
-
 
497
        xor     eax, eax
-
 
498
        ret
Line 486... Line 499...
486
 
499
 
487
        mov     ecx, pg_data.mutex
500
.expand:
488
        call    mutex_unlock
501
 
489
 
502
        mov     ecx, pg_data.mutex
Line 490... Line 503...
490
        xor     eax, eax
503
        call    mutex_lock
491
        ret
504
 
492
.expand:
-
 
493
 
-
 
494
        push    esi
-
 
495
        push    edi
505
        xchg    esi, edi
496
 
506
 
497
        add     edi, 0x3FFFFF
507
        push    esi                   ;new size
498
        and     edi, not(0x3FFFFF)
508
        push    edi                   ;old size
Line 499... Line 509...
499
        add     esi, 0x3FFFFF
509
 
Line 500... Line 510...
500
        and     esi, not(0x3FFFFF)
510
        add     edi, 0x3FFFFF
501
 
511
        and     edi, not(0x3FFFFF)
Line 522... Line 532...
522
 
532
 
523
        add     edi, 0x00400000
533
        add     edi, 0x00400000
524
        cmp     edi, esi
534
        cmp     edi, esi
525
        jb      @B
535
        jb      @B
526
.grow:
-
 
527
;//-
-
 
528
        pop     edi
-
 
529
        push    edi
536
.grow:
530
        mov     esi, [pg_data.pages_free]
-
 
531
        sub     esi, 1
-
 
532
        shr     edi, 12
-
 
533
        cmp     esi, edi
-
 
534
        jle     .out_of_memory
-
 
535
;//-
-
 
536
        pop     edi
-
 
537
        pop     esi
-
 
538
@@:
-
 
539
        call    alloc_page
-
 
540
        test    eax, eax
-
 
541
        jz      .exit
537
        pop     edi                   ;old size
Line 542... Line 538...
542
        stdcall map_page, esi, eax, dword PG_UW
538
        pop     ecx                   ;new size
543
 
539
 
544
        push    edi
540
        shr     edi, 10
-
 
541
        shr     ecx, 10
545
        mov     edi, esi
542
        sub     ecx, edi
-
 
543
        shr     ecx, 2                ;pages count
546
        xor     eax, eax
544
        mov     eax, 2
547
        mov     ecx, 1024
545
 
548
        cld
-
 
Line 549... Line 546...
549
        rep stosd
546
        add     edi, app_page_tabs
550
        pop     edi
547
        rep stosd
551
 
-
 
Line 552... Line 548...
552
        add     esi, 0x1000
548
 
553
        cmp     esi, edi
549
        mov     ecx, pg_data.mutex
554
        jb      @B
550
        call    mutex_unlock
555
 
-
 
556
        jmp     .update_size
-
 
557
;//-
-
 
558
.exit_pop:
-
 
559
.out_of_memory:
-
 
560
;//-
551
 
561
        pop     edi
552
        jmp     .update_size
Line -... Line 553...
-
 
553
 
-
 
554
.exit_fail:
-
 
555
        mov     ecx, pg_data.mutex
-
 
556
        call    mutex_unlock
562
        pop     esi
557
 
563
.exit:
558
        add     esp, 8
564
        mov     ecx, pg_data.mutex
559
        pop     edi
565
        call    mutex_unlock
560
        pop     esi
Line -... Line 561...
-
 
561
        pop     ebx
-
 
562
        xor     eax, eax
566
 
563
        inc     eax
567
        xor     eax, eax
564
        ret
568
        inc     eax
565
endp
569
        ret
566