Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | /* * Copyright (C) 2023 Apple Inc. All rights reserved. * * This document is the property of Apple Inc. * It is considered confidential and proprietary. * * This document may not be reproduced or transmitted in any form, * in whole or in part, without the express written permission of * Apple Inc. */ #include <knrheap/heap.h> #include <malloc/malloc.h> #include "../base.h" #include "../malloc_common.h" static size_t knrheap_zone_malloc_size(malloc_zone_t *zone __unused, const void * __unsafe_indexable ptr) { return liblibc_knrheap_malloc_size(ptr); } static void * __alloc_size(2) knrheap_zone_malloc(malloc_zone_t *zone __unused, size_t sz) { return liblibc_knrheap_malloc(sz); } static void * __alloc_size(2,3) knrheap_zone_calloc(malloc_zone_t *zone __unused, size_t num_items, size_t sz) { return liblibc_knrheap_calloc(num_items, sz); } static void * __alloc_size(2) knrheap_zone_valloc(malloc_zone_t *zone __unused, size_t sz) { return liblibc_knrheap_valloc(sz); } static void knrheap_zone_free(malloc_zone_t *zone __unused, void * __unsafe_indexable ptr) { return liblibc_knrheap_free(ptr); } static void * __alloc_size(3) knrheap_zone_realloc(malloc_zone_t *zone __unused, void * __unsafe_indexable ptr, size_t sz) { return liblibc_knrheap_realloc(ptr, sz); } static void knrheap_zone_destroy(malloc_zone_t *zone __unused) { } static void * __alloc_align(2) __alloc_size(3) knrheap_zone_memalign(malloc_zone_t *zone __unused, size_t alignment, size_t sz) { void * __unsafe_indexable ptr; if (!liblibc_knrheap_posix_memalign(&ptr, alignment, sz)) { return __unsafe_forge_bidi_indexable(void *, ptr, sz); } return NULL; } static boolean_t knrheap_zone_claimed_address(malloc_zone_t *zone __unused, void * __unsafe_indexable ptr) { return liblibc_knrheap_claimed_address(ptr); } static void knrheap_zone_try_free_default(malloc_zone_t *zone __unused, void * __unsafe_indexable ptr) { if (liblibc_knrheap_claimed_address(ptr)) { liblibc_knrheap_free(ptr); } else { find_zone_and_free(ptr, true); } } static size_t knrheap_zone_malloc_good_size(malloc_zone_t *zone __unused, size_t sz) { return liblibc_knrheap_malloc_good_size(sz); } static boolean_t knrheap_zone_check(malloc_zone_t *zone __unused) { return liblibc_knrheap_check(); } static malloc_introspection_t knrheap_zone_instrospect = { .enumerator = NULL, .good_size = knrheap_zone_malloc_good_size, .check = knrheap_zone_check, .print = NULL, .log = NULL, .force_lock = NULL, .force_unlock = NULL, .statistics = NULL, .zone_locked = NULL, .enable_discharge_checking = NULL, .disable_discharge_checking = NULL, .discharge = NULL, .enumerate_discharged_pointers = NULL, .reinit_lock = NULL, .print_task = NULL, .task_statistics = NULL, }; static malloc_zone_t knrheap_zone = { .reserved1 = NULL, .reserved2 = NULL, .size = knrheap_zone_malloc_size, .malloc = knrheap_zone_malloc, .calloc = knrheap_zone_calloc, .valloc = knrheap_zone_valloc, .free = knrheap_zone_free, .realloc = knrheap_zone_realloc, .destroy = knrheap_zone_destroy, .zone_name = NULL, .batch_malloc = NULL, .batch_free = NULL, .introspect = &knrheap_zone_instrospect, .version = 13, .memalign = knrheap_zone_memalign, .free_definite_size = NULL, .pressure_relief = NULL, .claimed_address = knrheap_zone_claimed_address, .try_free_default = knrheap_zone_try_free_default, }; malloc_zone_t * liblibc_knrheap_create_zone(void) { return &knrheap_zone; } |