Changeset da287d1 in mainline
- Timestamp:
- 2012-07-23T16:20:56Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c828803
- Parents:
- b078a42
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/malloc.c
rb078a42 rda287d1 110 110 111 111 #define AREA_LAST_BLOCK_HEAD(area) \ 112 ((uintptr_t) BLOCK_HEAD(((heap_block_foot_t *) AREA_LAST_BLOCK_FOOT(area))))112 ((uintptr_t) BLOCK_HEAD(((heap_block_foot_t *) AREA_LAST_BLOCK_FOOT(area)))) 113 113 114 114 /** Get header in heap block. … … 349 349 return false; 350 350 351 heap_block_head_t *last_head = (heap_block_head_t *) AREA_LAST_BLOCK_HEAD(area); 351 heap_block_head_t *last_head = 352 (heap_block_head_t *) AREA_LAST_BLOCK_HEAD(area); 352 353 353 354 if (last_head->free) { … … 651 652 652 653 /** Try to enlarge any of the heap areas. 653 * If successful, allocate block of the given size in the area.654 * 654 * 655 * If successful, allocate block of the given size in the area. 655 656 * Should be called only inside the critical section. 656 657 * 657 * @param size Gross size of item to allocate (bytes).658 * @param size Gross size of item to allocate (bytes). 658 659 * @param align Memory address alignment. 660 * 661 * @return Allocated block. 662 * @return NULL on failure. 659 663 * 660 664 */ … … 663 667 if (size == 0) 664 668 return NULL; 665 669 666 670 /* First try to enlarge some existing area */ 667 671 for (heap_area_t *area = first_heap_area; area != NULL; 668 672 area = area->next) { 669 673 670 674 if (area_grow(area, size + align)) { 671 heap_block_head_t *first = (heap_block_head_t *) AREA_LAST_BLOCK_HEAD(area); 672 673 void *addr = malloc_area(area, first, NULL, size, align); 675 heap_block_head_t *first = 676 (heap_block_head_t *) AREA_LAST_BLOCK_HEAD(area); 677 678 void *addr = 679 malloc_area(area, first, NULL, size, align); 674 680 malloc_assert(addr != NULL); 675 681 return addr; … … 679 685 /* Eventually try to create a new area */ 680 686 if (area_create(AREA_OVERHEAD(size + align))) { 681 heap_block_head_t *first = (heap_block_head_t *) AREA_FIRST_BLOCK_HEAD(last_heap_area); 682 683 void *addr = malloc_area(last_heap_area, first, NULL, size, align); 687 heap_block_head_t *first = 688 (heap_block_head_t *) AREA_FIRST_BLOCK_HEAD(last_heap_area); 689 690 void *addr = 691 malloc_area(last_heap_area, first, NULL, size, align); 684 692 malloc_assert(addr != NULL); 685 693 return addr; … … 707 715 708 716 size_t falign = lcm(align, BASE_ALIGN); 709 717 710 718 /* Check for integer overflow. */ 711 719 if (falign < align) 712 720 return NULL; 713 721 714 722 size_t gross_size = GROSS_SIZE(ALIGN_UP(size, BASE_ALIGN)); 715 723 716 heap_block_head_t *split;717 718 724 /* Try the next fit approach */ 719 split = next_fit;725 heap_block_head_t *split = next_fit; 720 726 721 727 if (split != NULL) {
Note:
See TracChangeset
for help on using the changeset viewer.