From e200c49f24c3b8ba8aa4fb65c7ecc5a04ef3471c Mon Sep 17 00:00:00 2001 From: mutouyun Date: Sun, 28 May 2023 12:37:54 +0800 Subject: [PATCH] fix: [concur] initialization issues for queue --- include/libconcur/queue.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/include/libconcur/queue.h b/include/libconcur/queue.h index 32bc9b8..544964b 100644 --- a/include/libconcur/queue.h +++ b/include/libconcur/queue.h @@ -40,7 +40,7 @@ private: ::LIBIMP::aligned> elements_start_; template - data(U &&model) noexcept + data(U &&model) : header_(std::forward(model)) { auto elements = this->elements(); typename decltype(elements)::size_type i = 0; @@ -52,6 +52,7 @@ private: for (decltype(i) k = 0; k < i; ++k) { (void)::LIBIMP::destroy>(&elements[k]); } + throw; } } @@ -79,21 +80,23 @@ private: if (!data_allocator_) { return nullptr; } + void *data_ptr = nullptr; LIBIMP_TRY { - auto data_ptr = data_allocator_.alloc(data::size_of(circ_size)); + data_ptr = data_allocator_.alloc(data::size_of(circ_size)); if (data_ptr == nullptr) { return nullptr; } return ::LIBIMP::construct(data_ptr, circ_size); } LIBIMP_CATCH(...) { + data_allocator_.dealloc(data_ptr, data::size_of(circ_size)); return nullptr; } } ::LIBPMR::allocator data_allocator_; - std::atomic size_; + std::atomic size_ {0}; data *data_; - typename concur::traits::context context_; + typename concur::traits::context context_ {}; public: queue(queue const &) = delete;