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 141 | /* * Copyright (c) 2023 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ #ifndef __EARLY_MALLOC_H #define __EARLY_MALLOC_H #pragma GCC visibility push(hidden) #if CONFIG_EARLY_MALLOC #include <stdbool.h> #include <malloc/malloc.h> /*! * @file early_allocator.h * * @discussion * The early allocator, cheekingly called "my first malloc" is a simple * allocator which is meant to support two use-cases such as: * * - malloc internal dynamic allocations, * - xzone first allocations in buckets until it is proven * that buckets are used enough. * * Its purpose is to be extremely simple and compact, and is not meant * to be feature rich. It will never implement things like: * - returning memory to the system, * - any form of scalability, * - realloc, * - allocations with alignment requirements, * - allocations larger than MFM_ALLOC_SIZE_MAX, * - ... * * It also is of limited capacity, and if mfm_alloc() fails, * then the caller should retry with another backend. */ /*! * @macro MFM_ALLOC_SIZE_MAX * * @brief * The maximum allocation size that this allocator supports. */ #define MFM_ALLOC_SIZE_MAX (16ul << 10) extern void mfm_lock(void); extern void mfm_unlock(void); extern void mfm_reinit_lock(void); /*! * @function mfm_initialize() * * @brief * Initializes the early allocator. * * @discussion * This function isn't thread safe and must be serialized * by the caller. */ extern void mfm_initialize(void); /*! * @function mfm_alloc_size() * * @brief * Returns the size of an allocation made with @c mfm_alloc(), * or @c 0 if the pointer doesn't belong to it. */ extern size_t mfm_alloc_size(const void *ptr); /*! * @function mfm_alloc() * * @brief * Perform an allocation with the early allocator. * * @discussion * The early allocator will only support a very small subset * of malloc features. Its allocations will always be zeroed, * and 16 bytes aligned. */ extern void *mfm_alloc(size_t size) __alloc_size(1); /*! * @function mfm_free() * * @brief * Frees a pointer allocated with @c mfm_alloc(). * * @discussion * Passing a pointer that doesn't belong to the early allocator * is undefined and will result in process termination. */ extern void mfm_free(void *ptr); /*! * @function mfm_claimed_address() * * @brief * Returns whether a pointer belongs to the early allocator. */ extern bool mfm_claimed_address(void *ptr); /*! * @function mfm_zone_address() * * @brief * Returns an opaque pointer to the state of the early allocator, to be used * only to pass to introspection functions. */ extern void *mfm_zone_address(void); extern const struct malloc_introspection_t mfm_introspect; #endif // CONFIG_EARLY_MALLOC #pragma GCC visibility pop #endif // __EARLY_MALLOC_H |