diff --git a/include/elem_circ.h b/include/elem_circ.h index 14bb414..73bcd32 100644 --- a/include/elem_circ.h +++ b/include/elem_circ.h @@ -286,8 +286,9 @@ public: } template - bool pop(detail::u2_t& cur, F&& f) noexcept { - return base_t::pop(this, cur, std::forward(f), block_); + bool pop(detail::u2_t* cur, F&& f) noexcept { + if (cur == nullptr) return false; + return base_t::pop(this, *cur, std::forward(f), block_); } }; diff --git a/include/queue.h b/include/queue.h index 5c8d2d5..3baa542 100644 --- a/include/queue.h +++ b/include/queue.h @@ -45,7 +45,7 @@ public: return elems_; } - std::size_t connect() noexcept { + std::size_t connect() { if (elems_ == nullptr) return invalid_value; if (connected_.exchange(true, std::memory_order_acq_rel)) { // if it's already connected, just return an error count @@ -56,7 +56,7 @@ public: return ret; } - std::size_t disconnect() noexcept { + std::size_t disconnect() { if (elems_ == nullptr) return invalid_value; if (!connected_.exchange(false, std::memory_order_acq_rel)) { // if it's already disconnected, just return an error count @@ -115,7 +115,7 @@ public: } template - auto push(P&&... params) noexcept { + auto push(P&&... params) { if (elems_ == nullptr) return false; if (elems_->push([&](void* p) { ::new (p) T(std::forward

(params)...); @@ -126,13 +126,13 @@ public: return false; } - T pop() noexcept { + T pop() { if (elems_ == nullptr) { return {}; } T item; for (unsigned k = 0;;) { - if (elems_->pop(cursor_, [&item](void* p) { + if (elems_->pop(&cursor_, [&item](void* p) { ::new (&item) T(std::move(*static_cast(p))); })) { return item; diff --git a/test/test_circ.cpp b/test/test_circ.cpp index a2d7a62..c9c0bf1 100644 --- a/test/test_circ.cpp +++ b/test/test_circ.cpp @@ -136,7 +136,7 @@ struct test_cq> { void recv(cn_t cur, F&& proc) { while (1) { msg_t msg; - while (ca_->pop(cur, [&msg](void* p) { + while (ca_->pop(&cur, [&msg](void* p) { msg = *static_cast(p); })) { if (msg.pid_ < 0) {