CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bigqueue.h
Go to the documentation of this file.
1 
8 #ifndef CVMFS_BIGQUEUE_H_
9 #define CVMFS_BIGQUEUE_H_
10 
11 #include <algorithm>
12 #include <cassert>
13 #include <cstdlib>
14 #include <new>
15 
16 #include "util/smalloc.h"
17 
18 template<class Item>
19 class BigQueue {
20  public:
22  Alloc(kNumInit);
23  size_ = 0;
24  }
25 
26  explicit BigQueue(const size_t num_items) {
27  size_t min_items = kNumInit;
28  Alloc(std::max(num_items, min_items));
29  size_ = 0;
30  }
31 
32  BigQueue(const BigQueue<Item> &other) { CopyFrom(other); }
33 
35  if (&other == this)
36  return *this;
37 
38  Dealloc();
39  CopyFrom(other);
40  return *this;
41  }
42 
43  ~BigQueue() { Dealloc(); }
44 
45  void PushBack(const Item &item) {
46  if (GetAvailableSpace() == 0) {
47  Migrate(1.9 * static_cast<float>(capacity_));
49  }
50  new (head_ + size_) Item(item);
51  size_++;
52  }
53 
54  void PopFront() {
55  assert(!IsEmpty());
56  head_++;
57  size_--;
58  if ((size_ > kCompactThreshold) && (size_ < (capacity_ / 2)))
59  Migrate(static_cast<int>(static_cast<float>(capacity_ * 0.6)));
60  }
61 
62  bool Peek(Item **item) {
63  if (IsEmpty())
64  return false;
65  *item = head_;
66  return true;
67  }
68 
69  bool IsEmpty() const { return size_ == 0; }
70 
71  void Clear() {
72  Dealloc();
73  Alloc(kNumInit);
74  }
75 
76  size_t size() const { return size_; }
77  size_t capacity() const { return capacity_; }
78 
79  private:
80  static const size_t kNumInit = 64;
81  static const size_t kCompactThreshold = 64;
82 
83  size_t GetHeadOffset() const { return head_ - buffer_; }
84  size_t GetAvailableSpace() const {
85  return capacity_ - (size_ + GetHeadOffset());
86  }
87 
88  void Alloc(const size_t num_elements) {
89  size_t num_bytes = sizeof(Item) * num_elements;
90  buffer_ = static_cast<Item *>(smmap(num_bytes));
91  capacity_ = num_elements;
92  head_ = buffer_;
93  }
94 
95  void Dealloc() {
97  buffer_ = NULL;
98  head_ = NULL;
99  capacity_ = 0;
100  size_ = 0;
101  }
102 
103  void Migrate(size_t new_capacity) {
104  assert(new_capacity > 0);
105  assert(new_capacity >= size_);
106 
107  size_t head_offset = GetHeadOffset();
108  Item *old_buffer = buffer_;
109 
110  Alloc(new_capacity);
111  for (size_t i = 0; i < size_; ++i)
112  new (buffer_ + i) Item(old_buffer[head_offset + i]);
113 
114  FreeBuffer(old_buffer, head_offset + size_);
115  }
116 
117  void FreeBuffer(Item *buf, const size_t nitems) {
118  for (size_t i = 0; i < nitems; ++i)
119  buf[i].~Item();
120 
121  if (buf)
122  smunmap(buf);
123  }
124 
125  void CopyFrom(const BigQueue<Item> &other) {
126  size_t min_items = kNumInit;
127  Alloc(std::max(other.size_, min_items));
128  for (size_t i = 0; i < other.size_; ++i) {
129  new (buffer_ + i) Item(*(other.buffer_ + other.GetHeadOffset() + i));
130  }
131  size_ = other.size_;
132  }
133 
134  Item *buffer_;
135  Item *head_;
136  size_t size_;
137  size_t capacity_;
138 };
139 
140 #endif // CVMFS_BIGQUEUE_H_
BigQueue(const size_t num_items)
Definition: bigqueue.h:26
void PopFront()
Definition: bigqueue.h:54
size_t capacity_
Definition: bigqueue.h:137
void Migrate(size_t new_capacity)
Definition: bigqueue.h:103
void Alloc(const size_t num_elements)
Definition: bigqueue.h:88
~BigQueue()
Definition: bigqueue.h:43
assert((mem||(size==0))&&"Out Of Memory")
BigQueue< Item > & operator=(const BigQueue< Item > &other)
Definition: bigqueue.h:34
void PushBack(const Item &item)
Definition: bigqueue.h:45
static const size_t kCompactThreshold
Definition: bigqueue.h:81
void Clear()
Definition: bigqueue.h:71
void Dealloc()
Definition: bigqueue.h:95
size_t capacity() const
Definition: bigqueue.h:77
size_t GetAvailableSpace() const
Definition: bigqueue.h:84
static const size_t kNumInit
Definition: bigqueue.h:80
size_t size() const
Definition: bigqueue.h:76
bool Peek(Item **item)
Definition: bigqueue.h:62
bool IsEmpty() const
Definition: bigqueue.h:69
size_t GetHeadOffset() const
Definition: bigqueue.h:83
void FreeBuffer(Item *buf, const size_t nitems)
Definition: bigqueue.h:117
size_t size_
Definition: bigqueue.h:136
void CopyFrom(const BigQueue< Item > &other)
Definition: bigqueue.h:125
BigQueue()
Definition: bigqueue.h:21
Item * buffer_
Definition: bigqueue.h:134
BigQueue(const BigQueue< Item > &other)
Definition: bigqueue.h:32
Item * head_
Definition: bigqueue.h:135