Lines Matching refs:size
65 size_t size; member
75 size_t size; member
99 …INFO, "\t\tbase %p, end 0x%lx, len 0x%zx\n", header, (vaddr_t)header + header->size, header->size); in dump_free()
106 (unsigned long)theheap.size, in cmpct_dump()
127 size_t size, size_t *rounded_up_out, int adjust, int increment) { in size_to_index_helper() argument
129 if (size <= 128) { in size_to_index_helper()
130 if (sizeof(size_t) == 8u && size <= sizeof(free_t) - sizeof(header_t)) { in size_to_index_helper()
133 *rounded_up_out = size; in size_to_index_helper()
140 return (size >> 3) - 1; in size_to_index_helper()
147 size += adjust; in size_to_index_helper()
152 unsigned row = sizeof(size_t) * 8 - 4 - __builtin_clzl(size); in size_to_index_helper()
154 unsigned column = (size >> row) & 7; in size_to_index_helper()
157 size = (8 + (row_column & 7)) << (row_column >> 3); in size_to_index_helper()
158 *rounded_up_out = size; in size_to_index_helper()
168 static int size_to_index_allocating(size_t size, size_t *rounded_up_out) { in size_to_index_allocating() argument
169 size_t rounded = ROUNDUP(size, 8); in size_to_index_allocating()
174 static int size_to_index_freeing(size_t size) { in size_to_index_freeing() argument
176 return size_to_index_helper(size, &dummy, 0, 0); in size_to_index_freeing()
192 return (header_t *)((char *)header + header->size); in right_header()
219 static void create_free_area(void *address, void *left, size_t size, free_t **bucket) { in create_free_area() argument
221 free_area->header.size = size; in create_free_area()
224 int index = size_to_index_freeing(size - sizeof(header_t)); in create_free_area()
233 theheap.remaining += size; in create_free_area()
235 memset(free_area + 1, FREE_FILL, size - sizeof(free_t)); in create_free_area()
240 return ((header_t *)address)->size == 0; in is_end_of_os_allocation()
243 static void free_to_os(header_t *header, size_t size) { in free_to_os() argument
244 DEBUG_ASSERT(IS_PAGE_ALIGNED(size)); in free_to_os()
245 page_free(header, size >> PAGE_SIZE_SHIFT); in free_to_os()
246 theheap.size -= size; in free_to_os()
249 static void free_memory(void *address, void *left, size_t size) { in free_memory() argument
253 is_end_of_os_allocation((char *)address + size)) { in free_memory()
254 free_to_os(left, size + ((header_t *)left)->size + sizeof(header_t)); in free_memory()
256 create_free_area(address, left, size, NULL); in free_memory()
261 theheap.remaining -= free_area->header.size; in unlink_free()
274 return unlink_free(free_area, size_to_index_freeing(free_area->header.size - sizeof(header_t))); in unlink_free_unknown_bucket()
278 void *address, size_t offset, size_t size, void *left) { in create_allocation_header() argument
281 standalone->size = size; in create_allocation_header()
470 static void cmpct_test_get_back_newly_freed_helper(size_t size) { in cmpct_test_get_back_newly_freed_helper() argument
471 void *allocated = cmpct_alloc(size); in cmpct_test_get_back_newly_freed_helper()
474 char *expected_position = (char *)allocated + size; in cmpct_test_get_back_newly_freed_helper()
486 void *allocated3 = cmpct_alloc(size); in cmpct_test_get_back_newly_freed_helper()
586 static void *large_alloc(size_t size) { in large_alloc() argument
588 size_t requested_size = size; in large_alloc()
590 size = ROUNDUP(size, 8); in large_alloc()
593 if (heap_grow(size, &free_area) < 0) { in large_alloc()
597 create_allocation_header(free_area, 0, free_area->header.size, free_area->header.left); in large_alloc()
603 theheap.remaining -= free_area->header.size; in large_alloc()
608 free_area->header.size - (requested_size + sizeof(header_t))); in large_alloc()
625 DEBUG_ASSERT(free_area->header.size >= PAGE_SIZE + sizeof(header_t)); in cmpct_trim()
639 size_t new_free_size = free_area->header.size - freed_up; in cmpct_trim()
646 theheap.size -= freed_up; in cmpct_trim()
660 size_t new_free_size = free_area->header.size - freed_up; in cmpct_trim()
677 theheap.size -= freed_up; in cmpct_trim()
684 void *cmpct_alloc(size_t size) { in cmpct_alloc() argument
685 if (size == 0u) return NULL; in cmpct_alloc()
687 if (size + sizeof(header_t) > (1u << HEAP_ALLOC_VIRTUAL_BITS)) return large_alloc(size); in cmpct_alloc()
690 int start_bucket = size_to_index_allocating(size, &rounded_up); in cmpct_alloc()
699 MAX(theheap.size >> 3, in cmpct_alloc()
711 size_t left_over = head->header.size - rounded_up; in cmpct_alloc()
717 if (left_over >= sizeof(free_t) && left_over > (size >> 6)) { in cmpct_alloc()
723 head->header.size -= left_over; in cmpct_alloc()
728 create_allocation_header(head, 0, head->header.size, head->header.left); in cmpct_alloc()
730 memset(result, ALLOC_FILL, size); in cmpct_alloc()
731 memset(((char *)result) + size, PADDING_FILL, rounded_up - size - sizeof(header_t)); in cmpct_alloc()
737 void *cmpct_memalign(size_t size, size_t alignment) { in cmpct_memalign() argument
738 if (alignment < 8) return cmpct_alloc(size); in cmpct_memalign()
740 size + alignment + sizeof(free_t) + sizeof(header_t); in cmpct_memalign()
752 header, 0, unaligned_header->size - left_over, unaligned_header); in cmpct_memalign()
754 unaligned_header->size = left_over; in cmpct_memalign()
769 size_t size = header->size; in cmpct_free() local
781 free_memory(left, left->left, left->size + size + right->size); in cmpct_free()
785 free_memory(left, left->left, left->size + size); in cmpct_free()
794 free_memory(header, left, size + right->size); in cmpct_free()
796 free_memory(header, left, size); in cmpct_free()
802 void *cmpct_realloc(void *payload, size_t size) { in cmpct_realloc() argument
803 if (payload == NULL) return cmpct_alloc(size); in cmpct_realloc()
805 size_t old_size = header->size - sizeof(header_t); in cmpct_realloc()
806 void *new_payload = cmpct_alloc(size); in cmpct_realloc()
807 memcpy(new_payload, payload, MIN(size, old_size)); in cmpct_realloc()
812 static void add_to_heap(void *new_area, size_t size, free_t **bucket) { in add_to_heap() argument
813 void *top = (char *)new_area + size; in add_to_heap()
818 size_t free_size = size - 2 * sizeof(header_t); in add_to_heap()
827 static ssize_t heap_grow(size_t size, free_t **bucket) { in heap_grow() argument
830 size += 2 * sizeof(header_t); in heap_grow()
831 size = ROUNDUP(size, PAGE_SIZE); in heap_grow()
832 void *ptr = page_alloc(size >> PAGE_SIZE_SHIFT, PAGE_ALLOC_ANY_ARENA); in heap_grow()
834 theheap.size += size; in heap_grow()
835 LTRACEF("growing heap by 0x%zx bytes, new ptr %p\n", size, ptr); in heap_grow()
836 add_to_heap(ptr, size, bucket); in heap_grow()
837 return size; in heap_grow()