util: Add an aligned realloc function
authorDylan Baker <dylan@pnwbakers.com>
Wed, 12 Sep 2018 23:26:38 +0000 (16:26 -0700)
committerDylan Baker <dylan@pnwbakers.com>
Tue, 21 Apr 2020 18:09:03 +0000 (11:09 -0700)
Mesa has one of these in imports.h, so u_memory needs one as well. This
is the version from mesa ported.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3024>

src/util/os_memory.h
src/util/os_memory_aligned.h
src/util/os_memory_stdc.h
src/util/u_memory.h

index 7a67e440deed5e94bc5f1357f5f592d5ff0f3b6c..bfb708151184808132597e5bb584365d3693000e 100644 (file)
@@ -60,6 +60,9 @@ os_malloc_aligned(size_t size, size_t alignment);
 void
 os_free_aligned(void *ptr);
 
+void *
+os_realloc_aligned(void *ptr, size_t oldsize, size_t newsize, size_t alignemnt);
+
 #ifdef __cplusplus
 }
 #endif
index 33eacb99c7f60477128dfc2c3f12f37da7cc87f5..08f12062a7fc4816deddd627d535d5a1dc93da6a 100644 (file)
@@ -36,7 +36,6 @@
 #endif
 
 
-
 /**
  * Add two size_t values with integer overflow check.
  * TODO: leverage __builtin_add_overflow where available
@@ -49,6 +48,22 @@ add_overflow_size_t(size_t a, size_t b, size_t *res)
 }
 
 
+#if defined(HAVE_POSIX_MEMALIGN)
+
+static inline void *
+os_malloc_aligned(size_t size, size_t alignment)
+{
+   void *ptr;
+   alignment = (alignment + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+   if(posix_memalign(&ptr, alignment, size) != 0)
+      return NULL;
+   return ptr;
+}
+
+#define os_free_aligned(_ptr) free(_ptr)
+
+#else
+
 /**
  * Return memory on given byte alignment
  */
@@ -93,3 +108,21 @@ os_free_aligned(void *ptr)
       os_free(realAddr);
    }
 }
+
+#endif
+
+/**
+ * Reallocate memeory, with alignment
+ */
+static inline void *
+os_realloc_aligned(void *ptr, size_t oldsize, size_t newsize, size_t alignment)
+{
+   const size_t copySize = MIN2(oldsize, newsize);
+   void *newBuf = os_malloc_aligned(newsize, alignment);
+   if (newBuf && ptr && copySize > 0) {
+      memcpy(newBuf, ptr, copySize);
+   }
+
+   os_free_aligned(ptr);
+   return newBuf;
+}
index a4a670d589accca2c4d6be2e329d7df28cd2ca2a..bda5715998fbe347aa647166e91acfbd040b8639 100644 (file)
 #define os_realloc( _old_ptr, _old_size, _new_size) \
    realloc(_old_ptr, _new_size + 0*(_old_size))
 
-
-#if defined(HAVE_POSIX_MEMALIGN)
-
-static inline void *
-os_malloc_aligned(size_t size, size_t alignment)
-{
-   void *ptr;
-   alignment = (alignment + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
-   if(posix_memalign(&ptr, alignment, size) != 0)
-      return NULL;
-   return ptr;
-}
-
-#define os_free_aligned(_ptr) free(_ptr)
-
-#elif DETECT_OS_WINDOWS
+#if DETECT_OS_WINDOWS
 
 #include <malloc.h>
 
 #define os_malloc_aligned(_size, _align) _aligned_malloc(_size, _align)
 #define os_free_aligned(_ptr) _aligned_free(_ptr)
+#define os_realloc_aligned(_ptr, _oldsize, _newsize, _alignment) _aligned_realloc(_ptr, _newsize, _alignment)
 
 #else
 
index 15a0bb419b5ebe100de48a73777bf6c01ab1534f..4cdccb66aaf4b8770b9b7144330fe971ff3f9f72 100644 (file)
@@ -60,6 +60,7 @@ extern "C" {
 
 #define align_malloc(_size, _alignment) os_malloc_aligned(_size, _alignment)
 #define align_free(_ptr) os_free_aligned(_ptr)
+#define align_realloc(_ptr, _oldsize, _newsize, _alignment) os_realloc_aligned(_ptr, _oldsize, _newsize, _alignment)
 
 static inline void *
 align_calloc(size_t size, unsigned long alignment)