| /* |
| * Allocation and free functions for aligned memory |
| * |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| * See the COPYING file in the top-level directory. |
| */ |
| |
| #ifndef QEMU_MEMALIGN_H |
| #define QEMU_MEMALIGN_H |
| |
| /** |
| * qemu_try_memalign: Allocate aligned memory |
| * @alignment: required alignment, in bytes |
| * @size: size of allocation, in bytes |
| * |
| * Allocate memory on an aligned boundary (i.e. the returned |
| * address will be an exact multiple of @alignment). |
| * @alignment must be a power of 2, or the function will assert(). |
| * On success, returns allocated memory; on failure, returns NULL. |
| * |
| * The memory allocated through this function must be freed via |
| * qemu_vfree() (and not via free()). |
| */ |
| void *qemu_try_memalign(size_t alignment, size_t size); |
| /** |
| * qemu_memalign: Allocate aligned memory, without failing |
| * @alignment: required alignment, in bytes |
| * @size: size of allocation, in bytes |
| * |
| * Allocate memory in the same way as qemu_try_memalign(), but |
| * abort() with an error message if the memory allocation fails. |
| * |
| * The memory allocated through this function must be freed via |
| * qemu_vfree() (and not via free()). |
| */ |
| void *qemu_memalign(size_t alignment, size_t size); |
| /** |
| * qemu_vfree: Free memory allocated through qemu_memalign |
| * @ptr: memory to free |
| * |
| * This function must be used to free memory allocated via qemu_memalign() |
| * or qemu_try_memalign(). (Using the wrong free function will cause |
| * subtle bugs on Windows hosts.) |
| */ |
| void qemu_vfree(void *ptr); |
| /* |
| * It's an analog of GLIB's g_autoptr_cleanup_generic_gfree(), used to define |
| * g_autofree macro. |
| */ |
| static inline void qemu_cleanup_generic_vfree(void *p) |
| { |
| void **pp = (void **)p; |
| qemu_vfree(*pp); |
| } |
| |
| /* |
| * Analog of g_autofree, but qemu_vfree is called on cleanup instead of g_free. |
| */ |
| #define QEMU_AUTO_VFREE __attribute__((cleanup(qemu_cleanup_generic_vfree))) |
| |
| #endif |