6 #include "common/Mutex.h"
7 #include "common/Cond.h"
16 typename
std::list
<T
> entries
;
18 QueueBucket() : lock("QueueRing::QueueBucket::lock") {}
19 QueueBucket(const QueueBucket
& rhs
) : lock("QueueRing::QueueBucket::lock") {
20 entries
= rhs
.entries
;
23 void enqueue(const T
& entry
) {
25 if (entries
.empty()) {
28 entries
.push_back(entry
);
32 void dequeue(T
*entry
) {
34 if (entries
.empty()) {
37 assert(!entries
.empty());
38 *entry
= entries
.front();
44 std::vector
<QueueBucket
> buckets
;
46 atomic_t cur_read_bucket
;
47 atomic_t cur_write_bucket
;
49 QueueRing(int n
) : buckets(n
), num_buckets(n
) {
52 void enqueue(const T
& entry
) {
53 buckets
[cur_write_bucket
.inc() % num_buckets
].enqueue(entry
);
56 void dequeue(T
*entry
) {
57 buckets
[cur_read_bucket
.inc() % num_buckets
].dequeue(entry
);