19 #ifndef EVS_INPUT_MAP2_HPP
20 #define EVS_INPUT_MAP2_HPP
22 #include "evs_message2.hpp"
24 #include "gcomm/datagram.hpp"
33 std::ostream& operator<<(std::ostream&,
const InputMapMsgKey&);
37 std::ostream& operator<<(std::ostream&,
const InputMapMsg&);
38 class InputMapMsgIndex;
40 std::ostream& operator<<(std::ostream&,
const InputMapNode&);
41 typedef std::vector<InputMapNode> InputMapNodeIndex;
42 std::ostream& operator<<(std::ostream&,
const InputMapNodeIndex&);
57 size_t index()
const {
return index_; }
58 evs::seqno_t seq ()
const {
return seq_; }
62 return (seq_ < cmp.seq_ || (seq_ == cmp.seq_ && index_ < cmp.index_));
67 evs::seqno_t
const seq_;
85 const Datagram& rb ()
const {
return rb_; }
94 #if defined(GALERA_USE_BOOST_POOL_ALLOC)
96 #include <boost/pool/pool_alloc.hpp>
99 public Map<InputMapMsgKey, InputMapMsg,
100 std::map<InputMapMsgKey,
102 std::less<InputMapMsgKey>,
103 boost::fast_pool_allocator<
104 std::pair<const InputMapMsgKey, InputMapMsg>,
105 boost::default_user_allocator_new_delete,
106 boost::details::pool::null_mutex
115 public Map<InputMapMsgKey, InputMapMsg>
124 InputMapNode() : idx_(), range_(0, -1), safe_seq_(-1) { }
126 void set_range (
const Range r) { range_ = r; }
127 void set_safe_seq (
const seqno_t s) { safe_seq_ = s; }
128 void set_index (
const size_t i) { idx_ = i; }
130 Range range ()
const {
return range_; }
131 seqno_t safe_seq ()
const {
return safe_seq_; }
132 size_t index ()
const {
return idx_; }
153 typedef InputMapMsgIndex::iterator iterator;
154 typedef InputMapMsgIndex::const_iterator const_iterator;
189 void set_safe_seq(
const size_t uuid,
const seqno_t seq);
202 return node_index_->at(uuid).safe_seq();
216 return node_index_->at(uuid).range();
219 seqno_t min_hs()
const;
221 seqno_t max_hs()
const;
228 iterator
begin()
const {
return msg_index_->begin(); }
235 iterator
end ()
const {
return msg_index_->end(); }
244 const seqno_t seq(InputMapMsgIndex::key(i).seq());
245 return (seq <= safe_seq_);
255 const seqno_t seq(InputMapMsgIndex::key(i).seq());
256 return (seq <= aru_seq_);
266 const seqno_t seq(InputMapMsgIndex::key(i).seq());
268 InputMapMsgIndex::key(i).index()]);
269 return (node.range().lu() > seq);
272 bool has_deliverables()
const
274 if (msg_index_->empty() ==
false)
276 if (n_msgs_[O_FIFO] > 0 &&
is_fifo(msg_index_->begin()))
278 else if (n_msgs_[O_AGREED] > 0 &&
is_agreed(msg_index_->begin()))
280 else if (n_msgs_[O_SAFE] > 0 &&
is_safe(msg_index_->begin()))
282 else if (n_msgs_[O_DROP] > max_droppable_)
305 Range
insert(
const size_t uuid,
const UserMessage& msg,
306 const Datagram& dg = Datagram());
317 void erase(iterator i);
329 iterator
find(
const size_t uuid,
const seqno_t seq)
const;
341 iterator
recover(
const size_t uuid,
const seqno_t seq)
const;
346 void reset(
const size_t,
const seqno_t = 256);
355 friend std::ostream& operator<<(std::ostream&,
const InputMap&);
368 void cleanup_recovery_index();
373 InputMapNodeIndex* node_index_;
374 InputMapMsgIndex* msg_index_;
375 InputMapMsgIndex* recovery_index_;
377 std::vector<size_t> n_msgs_;
378 size_t max_droppable_;
381 #endif // EVS_INPUT_MAP2_HPP
Definition: evs_seqno.hpp:31
Definition: evs_message2.hpp:390
Datagram container.
Definition: datagram.hpp:151