diff --git a/CMakeLists.txt b/CMakeLists.txt index 8807f73..f6e065c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ if(ENABLE_COVERAGE) add_custom_target(coverage COMMAND ${CMAKE_COMMAND} --build . --target all COMMAND ctest --output-on-failure - COMMAND ${LCOV_EXEC} --capture --directory ${CMAKE_BINARY_DIR} --output-file coverage.info --ignore-errors gcov,gcov + COMMAND ${LCOV_EXEC} --capture --directory ${CMAKE_BINARY_DIR} --output-file coverage.info --ignore-errors gcov,gcov --ignore-errors mismatch,mismatch COMMAND ${LCOV_EXEC} --remove coverage.info '/usr/*' --output-file coverage.filtered.info COMMAND ${GENHTML_EXEC} coverage.filtered.info --output-directory coverage-report WORKING_DIRECTORY ${CMAKE_BINARY_DIR} diff --git a/include/pool_allocator/pool_allocator.h b/include/pool_allocator/pool_allocator.h index bcb4384..16fc972 100644 --- a/include/pool_allocator/pool_allocator.h +++ b/include/pool_allocator/pool_allocator.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -253,9 +254,14 @@ class PoolAllocator : public pool_allocator_detail::ObjectOpsMixin& from); - // Transfer all memory blocks and free slots from another allocator + + // Transfer all memory blocks and free slots from another allocator. + // Locks this allocator's mutex (destination). The caller must be the owning + // thread of `from` (source) — no lock is taken on the source. void transfer_all(PoolAllocator& from); private: @@ -265,6 +271,11 @@ class PoolAllocator : public pool_allocator_detail::ObjectOpsMixin::transfer_all(PoolAllocator& from) { assert(&from != this && "Cannot import directly from self"); + std::lock_guard lock(transfer_mutex); allocator.transfer_all(from.allocator); } @@ -345,6 +346,7 @@ void PoolAllocator::transfer_free(PoolAllocator& from) { assert(&from != this && "Cannot import directly from self"); + std::lock_guard lock(transfer_mutex); allocator.transfer_free(from.allocator); }