1 /* 2 * Allocation and free functions for aligned memory 3 * 4 * This work is licensed under the terms of the GNU GPL, version 2 or later. 5 * See the COPYING file in the top-level directory. 6 */ 7 8 #ifndef QEMU_MEMALIGN_H 9 #define QEMU_MEMALIGN_H 10 11 /** 12 * qemu_try_memalign: Allocate aligned memory 13 * @alignment: required alignment, in bytes 14 * @size: size of allocation, in bytes 15 * 16 * Allocate memory on an aligned boundary (i.e. the returned 17 * address will be an exact multiple of @alignment). 18 * @alignment must be a power of 2, or the function will assert(). 19 * On success, returns allocated memory; on failure, returns NULL. 20 * 21 * The memory allocated through this function must be freed via 22 * qemu_vfree() (and not via free()). 23 */ 24 void *qemu_try_memalign(size_t alignment, size_t size); 25 /** 26 * qemu_memalign: Allocate aligned memory, without failing 27 * @alignment: required alignment, in bytes 28 * @size: size of allocation, in bytes 29 * 30 * Allocate memory in the same way as qemu_try_memalign(), but 31 * abort() with an error message if the memory allocation fails. 32 * 33 * The memory allocated through this function must be freed via 34 * qemu_vfree() (and not via free()). 35 */ 36 void *qemu_memalign(size_t alignment, size_t size); 37 /** 38 * qemu_vfree: Free memory allocated through qemu_memalign 39 * @ptr: memory to free 40 * 41 * This function must be used to free memory allocated via qemu_memalign() 42 * or qemu_try_memalign(). (Using the wrong free function will cause 43 * subtle bugs on Windows hosts.) 44 */ 45 void qemu_vfree(void *ptr); 46 /* 47 * It's an analog of GLIB's g_autoptr_cleanup_generic_gfree(), used to define 48 * g_autofree macro. 49 */ 50 static inline void qemu_cleanup_generic_vfree(void *p) 51 { 52 void **pp = (void **)p; 53 qemu_vfree(*pp); 54 } 55 56 /* 57 * Analog of g_autofree, but qemu_vfree is called on cleanup instead of g_free. 58 */ 59 #define QEMU_AUTO_VFREE __attribute__((cleanup(qemu_cleanup_generic_vfree))) 60 61 #endif 62