24 #include <seastar/net/packet.hh>
32 template <
typename Offset,
typename Tag>
35 static uint64_t& linearizations_ref() {
36 static thread_local uint64_t linearization_count;
37 return linearization_count;
40 std::map<Offset, packet> map;
42 static uint64_t linearizations() {
43 return linearizations_ref();
46 void merge(Offset offset,
packet p) {
49 auto end = beg + p.len();
51 for (
auto it = map.begin(); it != map.end();) {
52 auto& seg_pkt = it->second;
53 auto seg_beg = it->first;
54 auto seg_end = seg_beg + seg_pkt.len();
56 if (seg_beg <= beg && end <= seg_end) {
60 }
else if (beg <= seg_beg && seg_end <= end) {
67 }
else if (beg < seg_beg && seg_beg <= end && end <= seg_end) {
70 auto trim = end - seg_beg;
71 seg_pkt.trim_front(trim);
72 p.append(std::move(seg_pkt));
77 }
else if (seg_beg <= beg && beg <= seg_end && seg_end < end) {
80 auto trim = seg_end - beg;
83 seg_pkt.append(std::move(p));
85 ++linearizations_ref();
100 ++linearizations_ref();
101 map.emplace(beg, std::move(p));
107 for (
auto it = map.begin(); it != map.end();) {
109 auto& seg_pkt = it->second;
110 auto seg_beg = it->first;
111 auto seg_end = seg_beg + seg_pkt.len();
116 if (it_next == map.end()) {
119 auto& p = it_next->second;
120 auto beg = it_next->first;
121 auto end = beg + p.len();
124 if (seg_beg <= beg && beg <= seg_end && seg_end < end) {
126 auto trim = seg_end - beg;
129 seg_pkt.append(std::move(p));
137 }
else if (end <= seg_end) {
142 }
else if (seg_end < beg) {
148 std::cerr <<
"packet_merger: merge error\n";
Definition: packet-util.hh:33
Seastar API namespace.
Definition: abort_on_ebadf.hh:26