hmbdc
simplify-high-performance-messaging-programming
LockFreeBufferMisc.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/os/Allocators.hpp"
5 #include "hmbdc/Compile.hpp"
6 #include <utility>
7 #include <stdexcept>
8 #include <cstddef>
9 #include <functional>
10 
11 #include <stdint.h>
12 #include <stddef.h>
13 #include <malloc.h>
14 #include <stdlib.h>
15 #include <memory.h>
16 
17 
18 #ifndef SMP_CACHE_BYTES
19 #define SMP_CACHE_BYTES 64
20 #endif
21 
22 namespace hmbdc { namespace pattern {
23 namespace lf_misc {
24 
25 struct DeadConsumer : std::runtime_error {
26  DeadConsumer(const std::string& what_arg)
27  : std::runtime_error(what_arg){}
28 };
29 
30 template <typename Seq>
32  template<typename Allocator = os::DefaultAllocator>
33  chunk_base_ptr(uint32_t valueTypeSizePower2Num, uint32_t ringSizePower2Num
34  , Allocator& allocator = os::DefaultAllocator::instance)
35  : space_((char*)allocator.memalign(SMP_CACHE_BYTES, (1u << valueTypeSizePower2Num) * (1u << ringSizePower2Num))
36  - (char*)this)
37  , MASK((1u << ringSizePower2Num) - 1)
38  , valueTypeSizePower2Num_(valueTypeSizePower2Num)
39  , freer_([this, &allocator](){allocator.free(((char* const)this) + space_);}) {
40  }
41 
42  static size_t footprint(uint32_t valueTypeSizePower2Num, uint32_t ringSizePower2Num) {
43  return sizeof(chunk_base_ptr) + SMP_CACHE_BYTES * 2
44  + (1u << valueTypeSizePower2Num) * (1u << ringSizePower2Num);
45  }
46 
47  ~chunk_base_ptr() {
48  freer_();
49  }
50 
51  void* operator + (size_t index) const HMBDC_RESTRICT {
52  return (((char* const)this) + space_) + (index << valueTypeSizePower2Num_) + sizeof(Seq);
53  }
54 
55  Seq* getSeq(size_t index) const HMBDC_RESTRICT {
56  return reinterpret_cast<Seq*>((((char* const)this) + space_) + (index << valueTypeSizePower2Num_));
57  }
58 
59  friend
60  size_t operator - (void const* HMBDC_RESTRICT from, chunk_base_ptr<Seq> const& HMBDC_RESTRICT start) {
61  return (static_cast<char const*>(from) - sizeof(Seq) - (((char* const)&start) + start.space_))
62  >> start.valueTypeSizePower2Num_;
63  }
64  std::ptrdiff_t const space_;
65  Seq const MASK;
66  uint32_t const valueTypeSizePower2Num_;
67  std::function<void()> freer_;
68  chunk_base_ptr(chunk_base_ptr<Seq> const&) = delete;
69  chunk_base_ptr& operator = (chunk_base_ptr<Seq> const&) = delete;
70 } __attribute__((__aligned__(SMP_CACHE_BYTES)));
71 
72 template <typename Seq>
73 struct iterator {
74  using Sequence = Seq;
75  chunk_base_ptr<Seq> const * HMBDC_RESTRICT start_;
76  Seq seq_;
77 
78  //this ctor is only used by LockFreeBuffer itself
79  iterator(chunk_base_ptr<Seq> const& HMBDC_RESTRICT start, Seq seq)
80  : start_(&start), seq_(seq){}
81  iterator() : start_(nullptr), seq_(0){}
82  Seq seq() const {return seq_;}
83  void clear() {start_ = nullptr;}
84 
85  iterator& operator ++() HMBDC_RESTRICT {
86  ++seq_;
87  return *this;
88  }
89 
90  iterator operator ++(int) HMBDC_RESTRICT {
91  iterator tmp = *this;
92  ++*this;
93  return tmp;
94  }
95 
96  iterator operator + (size_t dis) const HMBDC_RESTRICT {
97  iterator tmp = *this;
98  tmp.seq_ += dis;
99  return tmp;
100  }
101 
102  size_t operator - (iterator const& other) const HMBDC_RESTRICT {
103  return seq_ - other.seq_;
104  }
105 
106  explicit operator bool() const HMBDC_RESTRICT {
107  return start_;
108  }
109 
110  bool operator < (iterator const& other) const HMBDC_RESTRICT {
111  return seq_ < other.seq_;
112  }
113 
114  bool operator == (iterator const& other) const HMBDC_RESTRICT {return seq_ == other.seq_;}
115  bool operator != (iterator const& other) const HMBDC_RESTRICT {return seq_ != other.seq_;}
116  void* operator*() const HMBDC_RESTRICT {return *start_ + (seq_ & start_->MASK);}
117  template <typename T> T& get() const HMBDC_RESTRICT { return *static_cast<T*>(**this); }
118  template <typename T>
119  T* operator->() HMBDC_RESTRICT {return static_cast<T*>(*start_ + (seq_ & start_->MASK));}
120 };
121 
122 } //lf_misc
123 }}
Definition: LockFreeBufferMisc.hpp:31
Definition: LockFreeBufferMisc.hpp:25
Definition: Base.hpp:12
Definition: LockFreeBufferMisc.hpp:73