From b7802b3b06511f067719cb845dfd03a223f0e18f Mon Sep 17 00:00:00 2001 From: Determinant Date: Wed, 3 Apr 2019 14:55:26 -0400 Subject: improve non-blocking API --- include/salticidae/queue.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'include/salticidae/queue.h') diff --git a/include/salticidae/queue.h b/include/salticidae/queue.h index a72a28f..0b4dae0 100644 --- a/include/salticidae/queue.h +++ b/include/salticidae/queue.h @@ -107,10 +107,8 @@ class MPMCQueue { MPMCQueue(const MPMCQueue &) = delete; MPMCQueue(MPMCQueue &&) = delete; - MPMCQueue(size_t capacity = 65536): head(new Block()), tail(head.load()) { + MPMCQueue(): head(new Block()), tail(head.load()) { head.load()->next = nullptr; - while (capacity--) - blks.push(new Block()); } ~MPMCQueue() { @@ -122,10 +120,18 @@ class MPMCQueue { } } + void set_capacity(size_t capacity = 0) { + while (capacity--) blks.push(new Block()); + } + template - bool enqueue(U &&e) { + bool enqueue(U &&e, bool unbounded = true) { FreeList::Node * _nblk; - if (!blks.pop(_nblk)) _nblk = new Block(); + if (!blks.pop(_nblk)) + { + if (unbounded) _nblk = new Block(); + else return false; + } _enqueue(static_cast(_nblk), std::forward(e)); return true; } -- cgit v1.2.3