diff --git a/intern/cycles/device/cpu/device_impl.cpp b/intern/cycles/device/cpu/device_impl.cpp index c912eeca5b7..62ae8f652bc 100644 --- a/intern/cycles/device/cpu/device_impl.cpp +++ b/intern/cycles/device/cpu/device_impl.cpp @@ -166,7 +166,7 @@ void CPUDevice::mem_free(device_memory &mem) } else if (mem.device_pointer) { if (mem.type == MEM_DEVICE_ONLY || !mem.host_pointer) { - util_aligned_free((void *)mem.device_pointer); + util_aligned_free((void *)mem.device_pointer, mem.memory_size()); } mem.device_pointer = 0; stats.mem_free(mem.device_size); diff --git a/intern/cycles/device/memory.cpp b/intern/cycles/device/memory.cpp index 03d5c1126ab..687c7400bd1 100644 --- a/intern/cycles/device/memory.cpp +++ b/intern/cycles/device/memory.cpp @@ -47,10 +47,7 @@ void *device_memory::host_alloc(const size_t size) void *ptr = util_aligned_malloc(size, MIN_ALIGNMENT_CPU_DATA_TYPES); - if (ptr) { - util_guarded_mem_alloc(size); - } - else { + if (ptr == nullptr) { throw std::bad_alloc(); } @@ -60,8 +57,7 @@ void *device_memory::host_alloc(const size_t size) void device_memory::host_free() { if (host_pointer) { - util_guarded_mem_free(memory_size()); - util_aligned_free(host_pointer); + util_aligned_free(host_pointer, memory_size()); host_pointer = nullptr; } } diff --git a/intern/cycles/test/util_aligned_malloc_test.cpp b/intern/cycles/test/util_aligned_malloc_test.cpp index 19c75e2d809..dca4d2edf45 100644 --- a/intern/cycles/test/util_aligned_malloc_test.cpp +++ b/intern/cycles/test/util_aligned_malloc_test.cpp @@ -14,7 +14,7 @@ TEST(util_aligned_malloc, aligned_malloc_16) { int *mem = (int *)util_aligned_malloc(sizeof(int), 16); CHECK_ALIGNMENT(mem, 16); - util_aligned_free(mem); + util_aligned_free(mem, sizeof(int)); } /* On Apple we currently only support 16 bytes alignment. */ @@ -23,7 +23,7 @@ TEST(util_aligned_malloc, aligned_malloc_32) { int *mem = (int *)util_aligned_malloc(sizeof(int), 32); CHECK_ALIGNMENT(mem, 32); - util_aligned_free(mem); + util_aligned_free(mem, sizeof(int)); } #endif /* __APPLE__ */ diff --git a/intern/cycles/util/aligned_malloc.cpp b/intern/cycles/util/aligned_malloc.cpp index b206c00157c..2cc63c831fd 100644 --- a/intern/cycles/util/aligned_malloc.cpp +++ b/intern/cycles/util/aligned_malloc.cpp @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "util/aligned_malloc.h" +#include "util/guarded_allocator.h" #ifdef WITH_BLENDER_GUARDEDALLOC # include "../../guardedalloc/MEM_guardedalloc.h" @@ -33,26 +34,31 @@ CCL_NAMESPACE_BEGIN void *util_aligned_malloc(const size_t size, const int alignment) { + void *mem = nullptr; #ifdef WITH_BLENDER_GUARDEDALLOC - return MEM_mallocN_aligned(size, alignment, "Cycles Aligned Alloc"); + mem = MEM_mallocN_aligned(size, alignment, "Cycles Aligned Alloc"); #elif defined(_WIN32) - return _aligned_malloc(size, alignment); + mem = _aligned_malloc(size, alignment); #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) - void *result; - if (posix_memalign(&result, alignment, size)) { + if (posix_memalign(&mem, alignment, size)) { /* Non-zero means allocation error - * either no allocation or bad alignment value. - */ - return nullptr; + * either no allocation or bad alignment value. */ + mem = nullptr; } - return result; #else /* This is for Linux. */ - return memalign(alignment, size); + mem = memalign(alignment, size); #endif + if (mem) { + util_guarded_mem_alloc(size); + } + return mem; } -void util_aligned_free(void *ptr) +void util_aligned_free(void *ptr, const size_t size) { + if (ptr) { + util_guarded_mem_free(size); + } #if defined(WITH_BLENDER_GUARDEDALLOC) if (ptr != nullptr) { MEM_freeN(ptr); diff --git a/intern/cycles/util/aligned_malloc.h b/intern/cycles/util/aligned_malloc.h index fbb9f4aa16b..421170b6320 100644 --- a/intern/cycles/util/aligned_malloc.h +++ b/intern/cycles/util/aligned_malloc.h @@ -15,7 +15,7 @@ CCL_NAMESPACE_BEGIN void *util_aligned_malloc(const size_t size, const int alignment); /* Free memory allocated by util_aligned_malloc. */ -void util_aligned_free(void *ptr); +void util_aligned_free(void *ptr, const size_t size); /* Aligned new operator. */ template T *util_aligned_new(Args... args) @@ -28,7 +28,7 @@ template void util_aligned_delete(T *t) { if (t) { t->~T(); - util_aligned_free(t); + util_aligned_free(t, sizeof(T)); } } diff --git a/intern/cycles/util/array.h b/intern/cycles/util/array.h index bf37dc227a1..aad7703723b 100644 --- a/intern/cycles/util/array.h +++ b/intern/cycles/util/array.h @@ -274,10 +274,7 @@ template clas return nullptr; } T *mem = (T *)util_aligned_malloc(sizeof(T) * N, alignment); - if (mem != nullptr) { - util_guarded_mem_alloc(sizeof(T) * N); - } - else { + if (mem == nullptr) { throw std::bad_alloc(); } return mem; @@ -286,8 +283,7 @@ template clas void mem_free(T *mem, const size_t N) { if (mem != nullptr) { - util_guarded_mem_free(sizeof(T) * N); - util_aligned_free(mem); + util_aligned_free(mem, sizeof(T) * N); } }