Ticket #2594: BufferQueue.cpp.1.diff

File BufferQueue.cpp.1.diff, 4.6 KB (added by Adek336, 15 years ago)
  • src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp

     
    100100        fLastSequence = sequence + buffer->size;
    101101
    102102    if (fFirstSequence > sequence) {
     103        ASSERT(fFirstSequence - sequence < buffer->size); // XXX
     104        //XXX remove_header(), remove_trailer() do not remove any bytes from the buffer
     105        //when passed with a byte count larger than the buffer size.
     106
    103107        // this buffer contains data that is already long gone - trim it
    104108        gBufferModule->remove_header(buffer, fFirstSequence - sequence);
    105109        sequence = fFirstSequence;
     110        buffer->sequence = fFirstSequence;
     111        // XXX
     112        // A similar line is near the top of this function.
    106113    }
    107114
    108115    // find the place where to insert the buffer into the queue
     
    129136                gBufferModule->free(buffer);
    130137                buffer = NULL;
    131138            } else {
     139                fNumBytes -= previous->size;
    132140                fList.Remove(previous);
    133141                gBufferModule->free(previous);
     142                //XXX fContiguousBytes will probably not be correctly maintained
     143                //if we got here to remove the first buffer in the queue
    134144            }
    135145        } else if (tcp_sequence(previous->sequence + previous->size) > sequence) {
    136             gBufferModule->remove_header(buffer,
    137                 previous->sequence + previous->size - sequence);
     146            if (previous->sequence + previous->size - sequence >= buffer->size) {
     147                gBufferModule->free(buffer);
     148                buffer = NULL;
     149            } else {
     150                gBufferModule->remove_header(buffer,
     151                    previous->sequence + previous->size - sequence);
     152            }
    138153        }
    139154    }
    140155
    141     if (buffer != NULL && next != NULL
     156    while (buffer != NULL && next != NULL
    142157        && tcp_sequence(sequence + buffer->size) > next->sequence) {
    143158        // we already have at least part of this data
    144159        if (tcp_sequence(next->sequence + next->size) < sequence + buffer->size) {
    145160            net_buffer *remove = next;
    146161            next = (net_buffer *)next->link.next;
    147162
     163            fNumBytes -= remove->size;
    148164            fList.Remove(remove);
    149165            gBufferModule->free(remove);
    150166        } else {
     167            ASSERT(sequence + buffer->size - next->sequence < buffer->size);    //XXX
    151168            gBufferModule->remove_trailer(buffer,
    152169                sequence + buffer->size - next->sequence);
    153170        }
     
    215232        } else {
    216233            // remove the header as far as needed
    217234            size_t size = sequence - buffer->sequence;
     235            //XXX
     236            ASSERT(size <= sequence - buffer->sequence);
    218237            gBufferModule->remove_header(buffer, size);
    219238
    220239            buffer->sequence += size;
     
    345364            iterator.Remove();
    346365            gBufferModule->free(source);
    347366        } else {
     367            //XXX remove_header does not remove anything when told to remove more bytes than the the buffer's size
     368            ASSERT(size <= source->size);
    348369            gBufferModule->remove_header(source, size);
    349370            source->sequence += size;
    350371        }
     
    377398    return fContiguousBytes + fFirstSequence - sequence;
    378399}
    379400
     401
    380402void
    381403BufferQueue::SetPushPointer()
    382404{
     
    385407    else
    386408        fPushPointer = fList.Tail()->sequence + fList.Tail()->size;
    387409}
     410
     411
     412/*! Sanity check
     413*/
     414void
     415BufferQueue::Verify()
     416{
     417    ASSERT(Available() == 0 || fList.First() != NULL);
     418
     419    if (fList.First() == NULL)
     420        return;
     421
     422    SegmentList::Iterator it = fList.GetIterator();
     423    net_buffer *nb;
     424    size_t sum=0;
     425    while ( (nb = it.Next()) != NULL )
     426        sum += nb->size;
     427
     428    if (sum != fNumBytes)
     429        TRACE(("BufferQueue@%p::Verify(): %d=sum != fNumBytes=%d\n", this, sum, fNumBytes));
     430    ASSERT(sum == fNumBytes);
     431}
     432
     433
     434void
     435BufferQueue::Dump()
     436{
     437    SegmentList::Iterator it = fList.GetIterator();
     438    net_buffer *nb;
     439
     440    TRACE(("BufferQueue@%p::Dump() >>>\n", this));
     441    while ( (nb = it.Next()) != NULL )
     442        TRACE(("BufferQueue@%p::Dump(): sequence 0x%x, size 0x%x\n", this, (uint32)nb->sequence, nb->size));
     443    TRACE(("BufferQueue@%p::Dump() <<<\n", this));
     444}
     445
  • src/add-ons/kernel/network/protocols/tcp/BufferQueue.h

     
    3636            size_t          Available() const { return fContiguousBytes; }
    3737            size_t          Available(tcp_sequence sequence) const;
    3838
    39     inline  size_t          PushedData() const;
     39            inline  size_t          PushedData() const;
    4040            void            SetPushPointer();
    4141
    4242            size_t          Used() const { return fNumBytes; }
     
    5151            tcp_sequence    NextSequence() const
    5252                                { return fFirstSequence + fContiguousBytes; }
    5353
     54            void            Verify();
     55            void            Dump();
     56
    5457private:
    5558    SegmentList             fList;
    5659    size_t                  fMaxBytes;