/* * Copyright (c) 2025 Ian Marco Moffett and the Osmora Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Hyra nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LIB_PTRBOX_H_ #define _LIB_PTRBOX_H_ #include #include /* * Represents allocation types in a pointerbox * * @PTRBOX_HEAP: kalloc() and friends */ typedef enum { PTRBOX_HEAP } ptrbox_altype_t; /* * Pointer box allocation descriptor used to * keep track of allocated memory * * @type: Allocation type * @base: Base address of allocation * @length: Length of allocation * @link: Queue link descriptor */ struct ptrbox_aldes { ptrbox_altype_t type; void *base; size_t length; TAILQ_ENTRY(ptrbox_aldes) link; }; /* * A pointer box keeps references to a list of * allocation descriptors. These references can * be cleaned up with a single call after use * * @alcnt: Number of allocations made * @allist: List of allocation descriptors */ struct ptrbox { size_t alcnt; TAILQ_HEAD(, ptrbox_aldes) allist; }; /* * Initialize a pointer box */ int ptrbox_init(struct ptrbox *pbox); /* * Allocate memory using a pointer box * * @pbox: Pointer box to allocate to * @len: Length of allocation to make * @type: Allocation type * * Returns the base of the memory on success */ void *ptrbox_alloc(struct ptrbox *pbox, size_t len, ptrbox_altype_t type); /* * Release a pointer box and associated resources * from memory */ void ptrbox_free(struct ptrbox *pbox); #endif /* !_LIB_PTRBOX_H_ */