Ticket #2594: BufferQueue.cpp.1.diff
File BufferQueue.cpp.1.diff, 4.6 KB (added by , 15 years ago) |
---|
-
src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp
100 100 fLastSequence = sequence + buffer->size; 101 101 102 102 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 103 107 // this buffer contains data that is already long gone - trim it 104 108 gBufferModule->remove_header(buffer, fFirstSequence - sequence); 105 109 sequence = fFirstSequence; 110 buffer->sequence = fFirstSequence; 111 // XXX 112 // A similar line is near the top of this function. 106 113 } 107 114 108 115 // find the place where to insert the buffer into the queue … … 129 136 gBufferModule->free(buffer); 130 137 buffer = NULL; 131 138 } else { 139 fNumBytes -= previous->size; 132 140 fList.Remove(previous); 133 141 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 134 144 } 135 145 } 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 } 138 153 } 139 154 } 140 155 141 if(buffer != NULL && next != NULL156 while (buffer != NULL && next != NULL 142 157 && tcp_sequence(sequence + buffer->size) > next->sequence) { 143 158 // we already have at least part of this data 144 159 if (tcp_sequence(next->sequence + next->size) < sequence + buffer->size) { 145 160 net_buffer *remove = next; 146 161 next = (net_buffer *)next->link.next; 147 162 163 fNumBytes -= remove->size; 148 164 fList.Remove(remove); 149 165 gBufferModule->free(remove); 150 166 } else { 167 ASSERT(sequence + buffer->size - next->sequence < buffer->size); //XXX 151 168 gBufferModule->remove_trailer(buffer, 152 169 sequence + buffer->size - next->sequence); 153 170 } … … 215 232 } else { 216 233 // remove the header as far as needed 217 234 size_t size = sequence - buffer->sequence; 235 //XXX 236 ASSERT(size <= sequence - buffer->sequence); 218 237 gBufferModule->remove_header(buffer, size); 219 238 220 239 buffer->sequence += size; … … 345 364 iterator.Remove(); 346 365 gBufferModule->free(source); 347 366 } 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); 348 369 gBufferModule->remove_header(source, size); 349 370 source->sequence += size; 350 371 } … … 377 398 return fContiguousBytes + fFirstSequence - sequence; 378 399 } 379 400 401 380 402 void 381 403 BufferQueue::SetPushPointer() 382 404 { … … 385 407 else 386 408 fPushPointer = fList.Tail()->sequence + fList.Tail()->size; 387 409 } 410 411 412 /*! Sanity check 413 */ 414 void 415 BufferQueue::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 434 void 435 BufferQueue::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
36 36 size_t Available() const { return fContiguousBytes; } 37 37 size_t Available(tcp_sequence sequence) const; 38 38 39 inline size_t PushedData() const;39 inline size_t PushedData() const; 40 40 void SetPushPointer(); 41 41 42 42 size_t Used() const { return fNumBytes; } … … 51 51 tcp_sequence NextSequence() const 52 52 { return fFirstSequence + fContiguousBytes; } 53 53 54 void Verify(); 55 void Dump(); 56 54 57 private: 55 58 SegmentList fList; 56 59 size_t fMaxBytes;