diff mbox series

[6/9] util: Share qemu_try_memalign() implementation between POSIX and Windows

Message ID 20220226180723.1706285-7-peter.maydell@linaro.org
State Superseded
Headers show
Series Cleanup of qemu_oom_check() and qemu_memalign() | expand

Commit Message

Peter Maydell Feb. 26, 2022, 6:07 p.m. UTC
The qemu_try_memalign() functions for POSIX and Windows used to be
significantly different, but these days they are identical except for
the actual allocation function called, and the POSIX version already
has to have ifdeffery for different allocation functions.

Move to a single implementation in memalign.c, which uses the Windows
_aligned_malloc if we detect that function in meson.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 meson.build        |  1 +
 util/memalign.c    | 33 +++++++++++++++++++++++++++++++++
 util/oslib-posix.c | 26 --------------------------
 util/oslib-win32.c | 18 ------------------
 4 files changed, 34 insertions(+), 44 deletions(-)

Comments

Richard Henderson Feb. 27, 2022, 12:56 a.m. UTC | #1
On 2/26/22 08:07, Peter Maydell wrote:
> The qemu_try_memalign() functions for POSIX and Windows used to be
> significantly different, but these days they are identical except for
> the actual allocation function called, and the POSIX version already
> has to have ifdeffery for different allocation functions.
> 
> Move to a single implementation in memalign.c, which uses the Windows
> _aligned_malloc if we detect that function in meson.
> 
> Signed-off-by: Peter Maydell<peter.maydell@linaro.org>
> ---
>   meson.build        |  1 +
>   util/memalign.c    | 33 +++++++++++++++++++++++++++++++++
>   util/oslib-posix.c | 26 --------------------------
>   util/oslib-win32.c | 18 ------------------
>   4 files changed, 34 insertions(+), 44 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~
diff mbox series

Patch

diff --git a/meson.build b/meson.build
index e08de177c87..21511d4fb61 100644
--- a/meson.build
+++ b/meson.build
@@ -1609,6 +1609,7 @@  config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'
 # Note that we need to specify prefix: here to avoid incorrectly
 # thinking that Windows has posix_memalign()
 config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
+config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
 config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
 config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
 config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
diff --git a/util/memalign.c b/util/memalign.c
index 6dfc20abbb1..ee3393cc601 100644
--- a/util/memalign.c
+++ b/util/memalign.c
@@ -26,6 +26,39 @@ 
 
 #include "qemu/osdep.h"
 
+void *qemu_try_memalign(size_t alignment, size_t size)
+{
+    void *ptr;
+
+    if (alignment < sizeof(void*)) {
+        alignment = sizeof(void*);
+    } else {
+        g_assert(is_power_of_2(alignment));
+    }
+
+#if defined(CONFIG_POSIX_MEMALIGN)
+    int ret;
+    ret = posix_memalign(&ptr, alignment, size);
+    if (ret != 0) {
+        errno = ret;
+        ptr = NULL;
+    }
+#elif defined(CONFIG_ALIGNED_MALLOC)
+    /* _aligned_malloc() fails on 0 size */
+    if (size) {
+        ptr = _aligned_malloc(size, alignment);
+    } else {
+        ptr = NULL;
+    }
+#elif defined(CONFIG_BSD)
+    ptr = valloc(size);
+#else
+    ptr = memalign(alignment, size);
+#endif
+    trace_qemu_memalign(alignment, size, ptr);
+    return ptr;
+}
+
 void *qemu_memalign(size_t alignment, size_t size)
 {
     void *p = qemu_try_memalign(alignment, size);
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 0278902ee79..91798f7e504 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -199,32 +199,6 @@  fail_close:
     return false;
 }
 
-void *qemu_try_memalign(size_t alignment, size_t size)
-{
-    void *ptr;
-
-    if (alignment < sizeof(void*)) {
-        alignment = sizeof(void*);
-    } else {
-        g_assert(is_power_of_2(alignment));
-    }
-
-#if defined(CONFIG_POSIX_MEMALIGN)
-    int ret;
-    ret = posix_memalign(&ptr, alignment, size);
-    if (ret != 0) {
-        errno = ret;
-        ptr = NULL;
-    }
-#elif defined(CONFIG_BSD)
-    ptr = valloc(size);
-#else
-    ptr = memalign(alignment, size);
-#endif
-    trace_qemu_memalign(alignment, size, ptr);
-    return ptr;
-}
-
 /* alloc shared memory pages */
 void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared,
                           bool noreserve)
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
index 8c1c64719d7..d9768532bec 100644
--- a/util/oslib-win32.c
+++ b/util/oslib-win32.c
@@ -44,24 +44,6 @@ 
 /* this must come after including "trace.h" */
 #include <shlobj.h>
 
-void *qemu_try_memalign(size_t alignment, size_t size)
-{
-    void *ptr;
-
-    if (alignment < sizeof(void *)) {
-        alignment = sizeof(void *);
-    } else {
-        g_assert(is_power_of_2(alignment));
-    }
-    if (size) {
-        ptr = _aligned_malloc(size, alignment);
-    } else {
-        ptr = NULL;
-    }
-    trace_qemu_memalign(alignment, size, ptr);
-    return ptr;
-}
-
 static int get_allocation_granularity(void)
 {
     SYSTEM_INFO system_info;