|
@@ -0,0 +1,61 @@
|
|
|
+/*
|
|
|
+ * 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
|