From 7e85d85e7a254d401e8c60acf3c81208b3787502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 30 Nov 2006 22:36:45 +0000 Subject: [PATCH] * TCPConnection::SendData() now waits until there is enough free space in the send queue (however, if the buffer sent is larger than the maximum buffer, it will just hang for now...). The check is also not thread-safe. * BufferQueue::Get() did not correctly maintain the fFirstSequence member in remove mode. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19403 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/protocols/tcp/BufferQueue.cpp | 11 +++++++---- .../kernel/network/protocols/tcp/TCPConnection.cpp | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp b/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp index 2c03ce361b..89e30ead2f 100644 --- a/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp @@ -287,10 +287,9 @@ BufferQueue::Get(size_t bytes, bool remove, net_buffer **_buffer) } else { // we can reuse this buffer bytesLeft -= buffer->size; - fList.Remove(buffer); + fFirstSequence += buffer->size; - if (fList.First() != NULL) - fFirstSequence = fList.First()->sequence; + fList.Remove(buffer); } // clone/copy the remaining data @@ -311,11 +310,15 @@ BufferQueue::Get(size_t bytes, bool remove, net_buffer **_buffer) // remove either the whole buffer or only the part we cloned + fFirstSequence += size; + if (size == source->size) { iterator.Remove(); gBufferModule->free(source); - } else + } else { gBufferModule->remove_header(source, size); + source->sequence += size; + } } if (status == B_OK) { diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPConnection.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPConnection.cpp index 355909cf27..60e32dcb5f 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPConnection.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPConnection.cpp @@ -384,6 +384,19 @@ TCPConnection::SendData(net_buffer *buffer) { TRACE(("TCP:%p.SendData()\n", this)); + // TODO: hangs if the buffer size is larger than the maximum! + while (fSendQueue.Free() < buffer->size) { + status_t status = acquire_sem_etc(fSendLock, 1, + B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, socket->send.timeout); + if (status < B_OK) + return status; + } + + // TODO: check state! + + if (buffer->size == 0) + return B_OK; + RecursiveLocker locker(fLock); fSendQueue.Add(buffer); return _SendQueued();