Commit d1677802 authored by Miroslav Crnic's avatar Miroslav Crnic Committed by Facebook Github Bot

UnboundedQueue::dequeue support for non default-constructible types

Summary:
`UnboundedQueue::try_dequeue` supports non default-constructible types but `UnboundedQueue::dequeue` does not.
This diff fixes it and cleans up functions made obsolete.

Reviewed By: shixiao

Differential Revision: D15199743

fbshipit-source-id: b2041c5cbffbbcfe153c218c467cfe04e5e5a544
parent e1ab01a5
...@@ -274,13 +274,11 @@ class UnboundedQueue { ...@@ -274,13 +274,11 @@ class UnboundedQueue {
/** dequeue */ /** dequeue */
FOLLY_ALWAYS_INLINE void dequeue(T& item) noexcept { FOLLY_ALWAYS_INLINE void dequeue(T& item) noexcept {
dequeueImpl(item); item = dequeueImpl();
} }
FOLLY_ALWAYS_INLINE T dequeue() noexcept { FOLLY_ALWAYS_INLINE T dequeue() noexcept {
T item; return dequeueImpl();
dequeueImpl(item);
return item;
} }
/** try_dequeue */ /** try_dequeue */
...@@ -401,32 +399,33 @@ class UnboundedQueue { ...@@ -401,32 +399,33 @@ class UnboundedQueue {
} }
/** dequeueImpl */ /** dequeueImpl */
FOLLY_ALWAYS_INLINE void dequeueImpl(T& item) noexcept { FOLLY_ALWAYS_INLINE T dequeueImpl() noexcept {
if (SPSC) { if (SPSC) {
Segment* s = head(); Segment* s = head();
dequeueCommon(s, item); return dequeueCommon(s);
} else { } else {
// Using hazptr_holder instead of hazptr_local because it is // Using hazptr_holder instead of hazptr_local because it is
// possible to call the T dtor and it may happen to use hazard // possible to call the T dtor and it may happen to use hazard
// pointers. // pointers.
hazptr_holder<Atom> hptr; hazptr_holder<Atom> hptr;
Segment* s = hptr.get_protected(c_.head); Segment* s = hptr.get_protected(c_.head);
dequeueCommon(s, item); return dequeueCommon(s);
} }
} }
/** dequeueCommon */ /** dequeueCommon */
FOLLY_ALWAYS_INLINE void dequeueCommon(Segment* s, T& item) noexcept { FOLLY_ALWAYS_INLINE T dequeueCommon(Segment* s) noexcept {
Ticket t = fetchIncrementConsumerTicket(); Ticket t = fetchIncrementConsumerTicket();
if (!SingleConsumer) { if (!SingleConsumer) {
s = findSegment(s, t); s = findSegment(s, t);
} }
size_t idx = index(t); size_t idx = index(t);
Entry& e = s->entry(idx); Entry& e = s->entry(idx);
e.takeItem(item); auto res = e.takeItem();
if (responsibleForAdvance(t)) { if (responsibleForAdvance(t)) {
advanceHead(s); advanceHead(s);
} }
return res;
} }
/** tryDequeueUntil */ /** tryDequeueUntil */
...@@ -459,7 +458,7 @@ class UnboundedQueue { ...@@ -459,7 +458,7 @@ class UnboundedQueue {
return folly::Optional<T>(); return folly::Optional<T>();
} }
setConsumerTicket(t + 1); setConsumerTicket(t + 1);
auto ret = e.takeItem(); folly::Optional<T> ret = e.takeItem();
if (responsibleForAdvance(t)) { if (responsibleForAdvance(t)) {
advanceHead(s); advanceHead(s);
} }
...@@ -487,7 +486,7 @@ class UnboundedQueue { ...@@ -487,7 +486,7 @@ class UnboundedQueue {
t, t + 1, std::memory_order_acq_rel, std::memory_order_acquire)) { t, t + 1, std::memory_order_acq_rel, std::memory_order_acquire)) {
continue; continue;
} }
auto ret = e.takeItem(); folly::Optional<T> ret = e.takeItem();
if (responsibleForAdvance(t)) { if (responsibleForAdvance(t)) {
advanceHead(s); advanceHead(s);
} }
...@@ -767,12 +766,7 @@ class UnboundedQueue { ...@@ -767,12 +766,7 @@ class UnboundedQueue {
flag_.post(); flag_.post();
} }
FOLLY_ALWAYS_INLINE void takeItem(T& item) noexcept { FOLLY_ALWAYS_INLINE T takeItem() noexcept {
flag_.wait();
getItem(item);
}
FOLLY_ALWAYS_INLINE folly::Optional<T> takeItem() noexcept {
flag_.wait(); flag_.wait();
return getItem(); return getItem();
} }
...@@ -796,13 +790,8 @@ class UnboundedQueue { ...@@ -796,13 +790,8 @@ class UnboundedQueue {
} }
private: private:
FOLLY_ALWAYS_INLINE void getItem(T& item) noexcept { FOLLY_ALWAYS_INLINE T getItem() noexcept {
item = std::move(*(itemPtr())); T ret = std::move(*(itemPtr()));
destroyItem();
}
FOLLY_ALWAYS_INLINE folly::Optional<T> getItem() noexcept {
folly::Optional<T> ret = std::move(*(itemPtr()));
destroyItem(); destroyItem();
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment