]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
7c673cae FG |
4 | #ifndef QUEUE_RING_H |
5 | #define QUEUE_RING_H | |
6 | ||
11fdf7f2 | 7 | #include "common/ceph_mutex.h" |
7c673cae | 8 | |
31f18b77 FG |
9 | #include <list> |
10 | #include <atomic> | |
11 | #include <vector> | |
7c673cae FG |
12 | |
13 | template <class T> | |
14 | class QueueRing { | |
15 | struct QueueBucket { | |
11fdf7f2 TL |
16 | ceph::mutex lock = ceph::make_mutex("QueueRing::QueueBucket::lock"); |
17 | ceph::condition_variable cond; | |
7c673cae FG |
18 | typename std::list<T> entries; |
19 | ||
11fdf7f2 TL |
20 | QueueBucket() {} |
21 | QueueBucket(const QueueBucket& rhs) { | |
7c673cae FG |
22 | entries = rhs.entries; |
23 | } | |
24 | ||
25 | void enqueue(const T& entry) { | |
11fdf7f2 | 26 | lock.lock(); |
7c673cae | 27 | if (entries.empty()) { |
11fdf7f2 | 28 | cond.notify_all(); |
7c673cae FG |
29 | } |
30 | entries.push_back(entry); | |
11fdf7f2 | 31 | lock.unlock(); |
7c673cae FG |
32 | } |
33 | ||
34 | void dequeue(T *entry) { | |
11fdf7f2 TL |
35 | std::unique_lock l(lock); |
36 | while (entries.empty()) { | |
37 | cond.wait(l); | |
7c673cae | 38 | }; |
11fdf7f2 | 39 | ceph_assert(!entries.empty()); |
7c673cae FG |
40 | *entry = entries.front(); |
41 | entries.pop_front(); | |
7c673cae FG |
42 | }; |
43 | }; | |
44 | ||
45 | std::vector<QueueBucket> buckets; | |
46 | int num_buckets; | |
31f18b77 FG |
47 | |
48 | std::atomic<int64_t> cur_read_bucket = { 0 }; | |
49 | std::atomic<int64_t> cur_write_bucket = { 0 }; | |
50 | ||
7c673cae FG |
51 | public: |
52 | QueueRing(int n) : buckets(n), num_buckets(n) { | |
53 | } | |
54 | ||
55 | void enqueue(const T& entry) { | |
31f18b77 | 56 | buckets[++cur_write_bucket % num_buckets].enqueue(entry); |
7c673cae FG |
57 | }; |
58 | ||
59 | void dequeue(T *entry) { | |
31f18b77 | 60 | buckets[++cur_read_bucket % num_buckets].dequeue(entry); |
7c673cae FG |
61 | } |
62 | }; | |
63 | ||
64 | #endif |