Commit 079dfee3 authored by jan.koester's avatar jan.koester
Browse files

test

parent ba3b6252
Loading
Loading
Loading
Loading
+60 −27
Original line number Diff line number Diff line
@@ -4436,7 +4436,38 @@ void quic::processStreamFrame(const uint8_t* data, size_t len, size_t& offset) {
                         &data[src_off], copy_len);
        }

        // Track received range — merge with adjacent/overlapping ranges
        // Track received range — merge with adjacent/overlapping ranges.
        //
        // Fast path for the overwhelmingly common case (in-order delivery,
        // no reordering/loss in flight): recv_ranges holds exactly one
        // entry starting at 0, and this frame only extends or overlaps it.
        // The general path below handles this correctly too, but always
        // pays for a fresh insert plus an erase+erase+insert merge cycle
        // (4 red-black-tree node operations) even though nothing here is
        // actually out of order — this path does the same net update
        // (grow the sole [0, recv_contiguous) range) in one erase + one
        // insert instead.
        bool handled_by_fast_path = false;
        if (stream.recv_ranges.size() <= 1) {
            if (stream.recv_ranges.empty()) {
                if (stream_offset == 0) {
                    stream.recv_ranges.insert({0, end_offset});
                    handled_by_fast_path = true;
                }
            } else {
                auto& only = *stream.recv_ranges.begin();
                if (only.first == 0 && stream_offset <= only.second) {
                    uint64_t new_hi = std::max(only.second, end_offset);
                    if (new_hi != only.second) {
                        stream.recv_ranges.erase(stream.recv_ranges.begin());
                        stream.recv_ranges.insert({0, new_hi});
                    }
                    handled_by_fast_path = true;
                }
            }
        }

        if (!handled_by_fast_path) {
            auto new_range = std::make_pair(stream_offset, end_offset);
            auto it = stream.recv_ranges.insert(new_range).first;

@@ -4467,6 +4498,8 @@ void quic::processStreamFrame(const uint8_t* data, size_t len, size_t& offset) {
                    break;
                }
            }
        }


        // Update contiguous byte count
        if (!stream.recv_ranges.empty() && stream.recv_ranges.begin()->first == 0) {