Skip to content

Commit 1d0ea58

Browse files
Handle empty bulk enqueue
1 parent 2195ffb commit 1d0ea58

2 files changed

Lines changed: 23 additions & 2 deletions

File tree

include/daking/MPSC_queue.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,9 @@ namespace daking {
486486
DAKING_ALWAYS_INLINE void enqueue_bulk(const_reference value, size_type n) {
487487
// N times thread_local operation, One time CAS operation.
488488
// So it is more efficient than N times enqueue.
489+
if (n == 0) {
490+
return;
491+
}
489492

490493
node_t* first_new_node = _allocate();
491494
node_t* prev_node = first_new_node;
@@ -511,6 +514,9 @@ namespace daking {
511514
"Iterator must be at least input iterator.");
512515
static_assert(std::is_same_v<typename std::iterator_traits<InputIt>::value_type, value_type>,
513516
"The value type of iterator must be same as MPSC_queue::value_type.");
517+
if (n == 0) {
518+
return;
519+
}
514520

515521
node_t* first_new_node = _allocate();
516522
node_t* prev_node = first_new_node;
@@ -743,4 +749,4 @@ namespace daking {
743749
};
744750
}
745751

746-
#endif // !DAKING_MPSC_QUEUE_HPP
752+
#endif // !DAKING_MPSC_QUEUE_HPP

tests/test_MPSC.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,21 @@ TEST(MPSCQueueBulkTest, EnqueueBulk_InputIterator) {
133133
EXPECT_TRUE(queue.empty());
134134
}
135135

136+
TEST(MPSCQueueBulkTest, EnqueueBulk_EmptyRangeIsNoOp) {
137+
TestQueue queue;
138+
const int value = 99;
139+
std::vector<int> data;
140+
141+
queue.enqueue_bulk(value, 0);
142+
EXPECT_TRUE(queue.empty());
143+
144+
queue.enqueue_bulk(data.begin(), data.size());
145+
EXPECT_TRUE(queue.empty());
146+
147+
queue.enqueue_bulk(data.begin(), data.end());
148+
EXPECT_TRUE(queue.empty());
149+
}
150+
136151
TEST(MPSCQueueBulkTest, TryDequeueBulk_Partial) {
137152
TestQueue queue;
138153
queue.enqueue(1);
@@ -306,4 +321,4 @@ TEST(MPSCQueueBlockTest, DequeueBulk_BlockAndWait) {
306321
EXPECT_EQ(results[2], 3);
307322
EXPECT_TRUE(queue.empty());
308323
}
309-
#endif
324+
#endif

0 commit comments

Comments
 (0)