hmbdc
simplify-high-performance-messaging-programming
LockFreeBufferT.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/pattern/LockFreeBufferMisc.hpp"
5 #include "hmbdc/os/Allocators.hpp"
6 
7 #include "hmbdc/Config.hpp"
8 
9 #include <utility>
10 #include <stdexcept>
11 #include <vector>
12 #include <limits>
13 #include <cstddef>
14 
15 namespace hmbdc { namespace pattern {
16 
17 template <uint16_t MAX_PARALLE_CONSUMER>
19  using Sequence = HMBDC_SEQ_TYPE;
21  using value_type = void *;
23  enum {
24  max_parallel_consumer = MAX_PARALLE_CONSUMER
25  };
26 
27  template <typename Allocator = os::DefaultAllocator>
28  LockFreeBufferT(size_t, uint32_t, Allocator& allocator = os::DefaultAllocator::instance);
29 
30  ~LockFreeBufferT();
31  size_t capacity() const;
32  size_t maxItemSize() const;
33 
34  void put(void const*, size_t sizeHint = 0);
35  template <typename T> void put(T const& item) {put(&item, sizeof(T));}
36 
37  bool tryPut(void const*, size_t sizeHint = 0);
38  template <typename T> bool tryPut(T const& item) {return tryPut(&item, sizeof(T));}
39 
40  void killPut(void const*, size_t sizeHint = 0);
41 
42  template <typename T> void killPut(T const& item) {killPut(&item, sizeof(T));}
43 
44  template <typename T, typename ...Args>
45  void putInPlace(Args&&... args) {
46  auto s = claim();
47  new (*s) T(std::forward<Args>(args)...);
48  commit(s);
49  }
50 
51  bool isFull() const;
52  Sequence readSeq(uint16_t PARALLEL_CONSUMER_INDEX) const;
53  iterator claim();
54  iterator tryClaim();
55  iterator claim(size_t);
56  iterator tryClaim(size_t);
57  iterator killClaim();
58  iterator killClaim(size_t);
59  void commit(iterator);
60  void commit(iterator, size_t);
61  void markDead(uint16_t);
62 
63  template <typename T>
64  T take(uint16_t PARALLEL_CONSUMER_INDEX) {
65  T res;
66  take(PARALLEL_CONSUMER_INDEX, &res, sizeof(res));
67  return res;
68  }
69 
70  void take(uint16_t PARALLEL_CONSUMER_INDEX, void *, size_t = 0);
71  void takeReentrant(uint16_t PARALLEL_CONSUMER_INDEX, void *, size_t = 0);
72  iterator peek(uint16_t PARALLEL_CONSUMER_INDEX) const;
73  size_t peek(uint16_t PARALLEL_CONSUMER_INDEX, iterator&, iterator&
74  , size_t maxPeekSize = std::numeric_limits<size_t>::max()) const;
75  void waste(uint16_t PARALLEL_CONSUMER_INDEX, size_t);
76  void wasteAfterPeek(uint16_t PARALLEL_CONSUMER_INDEX, size_t);
77  void catchUpWith(uint16_t PARALLEL_CONSUMER_INDEX, uint16_t);
78  void catchUpTo(uint16_t PARALLEL_CONSUMER_INDEX, Sequence);
79 
80  size_t remainingSize(uint16_t PARALLEL_CONSUMER_INDEX) const;
81  size_t remainingSize() const;
82  size_t parallelConsumerAlive() const;
83  void reset(uint16_t PARALLEL_CONSUMER_INDEX);
84 
85  static
86  size_t footprint(size_t, uint32_t);
87  uint64_t purge();
88 
89  std::vector<uint16_t>
90  unusedConsumerIndexes() const;
91 
92 private:
93  std::ptrdiff_t impl_;
94  bool allocateFromHeap_;
95 };
96 
97 }} // end namespace hmbdc::pattern
98 
Definition: LockFreeBufferMisc.hpp:23
Definition: LockFreeBufferT.hpp:18
Definition: Client.hpp:11
Definition: LockFreeBufferMisc.hpp:73