From 77d1c20fb7855c9ca74d5fb5d99001abaa09da46 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 16 Mar 2020 19:34:08 +0300 Subject: [PATCH] core(buffer_area): handle 'OPENCV_ENABLE_MEMORY_SANITIZER=ON' case --- .../core/utils/buffer_area.private.hpp | 6 ++++ modules/core/src/buffer_area.cpp | 36 +++++++++++++------ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/modules/core/include/opencv2/core/utils/buffer_area.private.hpp b/modules/core/include/opencv2/core/utils/buffer_area.private.hpp index ab19da6416..f6bb93e088 100644 --- a/modules/core/include/opencv2/core/utils/buffer_area.private.hpp +++ b/modules/core/include/opencv2/core/utils/buffer_area.private.hpp @@ -72,6 +72,10 @@ public: CV_Assert(alignment % sizeof(T) == 0); CV_Assert((alignment & (alignment - 1)) == 0); allocate_((void**)(&ptr), static_cast(sizeof(T)), count, alignment); +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER + if (safe) +#endif + CV_Assert(ptr != NULL); } /** @brief Fill one of buffers with zeroes @@ -118,9 +122,11 @@ private: private: class Block; std::vector blocks; +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER void * oneBuf; size_t totalSize; const bool safe; +#endif }; //! @} diff --git a/modules/core/src/buffer_area.cpp b/modules/core/src/buffer_area.cpp index b6bb321bba..2fe9d782ae 100644 --- a/modules/core/src/buffer_area.cpp +++ b/modules/core/src/buffer_area.cpp @@ -5,14 +5,10 @@ #include "opencv2/core/utils/buffer_area.private.hpp" #include "opencv2/core/utils/configuration.private.hpp" -#ifdef OPENCV_ENABLE_MEMORY_SANITIZER -#define BUFFER_AREA_DEFAULT_MODE true -#else -#define BUFFER_AREA_DEFAULT_MODE false -#endif - +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER static bool CV_BUFFER_AREA_OVERRIDE_SAFE_MODE = - cv::utils::getConfigurationParameterBool("OPENCV_BUFFER_AREA_ALWAYS_SAFE", BUFFER_AREA_DEFAULT_MODE); + cv::utils::getConfigurationParameterBool("OPENCV_BUFFER_AREA_ALWAYS_SAFE", false); +#endif namespace cv { namespace utils { @@ -58,6 +54,7 @@ public: *ptr = raw_mem; } } +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER void * fast_allocate(void * buf) const { CV_Assert(ptr && *ptr == NULL); @@ -66,6 +63,7 @@ public: *ptr = buf; return static_cast(static_cast(*ptr) + type_size * count); } +#endif bool operator==(void **other) const { CV_Assert(ptr && other); @@ -86,12 +84,20 @@ private: //================================================================================================== +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER BufferArea::BufferArea(bool safe_) : oneBuf(0), totalSize(0), safe(safe_ || CV_BUFFER_AREA_OVERRIDE_SAFE_MODE) { + // nothing } +#else +BufferArea::BufferArea(bool safe_) +{ + CV_UNUSED(safe_); +} +#endif BufferArea::~BufferArea() { @@ -101,10 +107,16 @@ BufferArea::~BufferArea() void BufferArea::allocate_(void **ptr, ushort type_size, size_t count, ushort alignment) { blocks.push_back(Block(ptr, type_size, count, alignment)); - if (safe) - blocks.back().real_allocate(); - else +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER + if (!safe) + { totalSize += blocks.back().getByteCount(); + } + else +#endif + { + blocks.back().real_allocate(); + } } void BufferArea::zeroFill_(void **ptr) @@ -129,6 +141,7 @@ void BufferArea::zeroFill() void BufferArea::commit() { +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER if (!safe) { CV_Assert(totalSize > 0); @@ -141,6 +154,7 @@ void BufferArea::commit() ptr = i->fast_allocate(ptr); } } +#endif } void BufferArea::release() @@ -150,11 +164,13 @@ void BufferArea::release() i->cleanup(); } blocks.clear(); +#ifndef OPENCV_ENABLE_MEMORY_SANITIZER if (oneBuf) { fastFree(oneBuf); oneBuf = 0; } +#endif } //==================================================================================================