From fe0ab2867a7f7d03b8bdc231592807553aee72f3 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Wed, 23 May 2007 08:21:09 +0000 Subject: [PATCH] tcp: no longer need recursive locking. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21216 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../network/protocols/tcp/TCPEndpoint.cpp | 59 +++++++++---------- .../network/protocols/tcp/TCPEndpoint.h | 6 +- .../kernel/network/protocols/tcp/tcp.cpp | 8 +-- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 65ce288969..9d6e03cf11 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -190,7 +190,7 @@ WaitList::InitCheck() const status_t -WaitList::Wait(RecursiveLocker &locker, bigtime_t timeout, bool wakeNext) +WaitList::Wait(MutexLocker &locker, bigtime_t timeout, bool wakeNext) { locker.Unlock(); @@ -252,8 +252,8 @@ TCPEndpoint::TCPEndpoint(net_socket *socket) { //gStackModule->init_timer(&fTimer, _TimeWait, this); - recursive_lock_init(&fLock, "tcp lock"); - // TODO: to be replaced with a real locking strategy! + // TODO: to be replaced with a real locking strategy! + mutex_init(&fLock, "tcp lock"); gStackModule->init_timer(&fPersistTimer, TCPEndpoint::_PersistTimer, this); gStackModule->init_timer(&fRetransmitTimer, TCPEndpoint::_RetransmitTimer, this); @@ -265,7 +265,7 @@ TCPEndpoint::TCPEndpoint(net_socket *socket) TCPEndpoint::~TCPEndpoint() { - recursive_lock_lock(&fLock); + mutex_lock(&fLock); gStackModule->cancel_timer(&fRetransmitTimer); gStackModule->cancel_timer(&fPersistTimer); @@ -277,7 +277,7 @@ TCPEndpoint::~TCPEndpoint() return_endpoint_manager(fManager); } - recursive_lock_destroy(&fLock); + mutex_destroy(&fLock); } @@ -322,7 +322,7 @@ TCPEndpoint::Close() { TRACE("Close()"); - RecursiveLocker lock(fLock); + MutexLocker lock(fLock); if (fState == LISTEN) delete_sem(fAcceptSemaphore); @@ -363,7 +363,7 @@ TCPEndpoint::Free() { TRACE("Free()"); - RecursiveLocker _(fLock); + MutexLocker _(fLock); if (fState <= SYNCHRONIZE_SENT || fState == TIME_WAIT) return B_OK; @@ -384,7 +384,7 @@ TCPEndpoint::Connect(const sockaddr *address) { TRACE("Connect() on address %s", PrintAddress(address)); - RecursiveLocker locker(fLock); + MutexLocker locker(fLock); // Can only call connect() from CLOSED or LISTEN states // otherwise endpoint is considered already connected @@ -436,7 +436,7 @@ TCPEndpoint::Accept(struct net_socket **_acceptedSocket) { TRACE("Accept()"); - RecursiveLocker locker(fLock); + MutexLocker locker(fLock); status_t status; bigtime_t timeout = absolute_timeout(socket->receive.timeout); @@ -465,7 +465,7 @@ TCPEndpoint::Bind(const sockaddr *address) if (address == NULL) return B_BAD_VALUE; - RecursiveLocker lock(fLock); + MutexLocker lock(fLock); TRACE("Bind() on address %s", PrintAddress(address)); @@ -481,7 +481,7 @@ TCPEndpoint::Unbind(struct sockaddr *address) { TRACE("Unbind()"); - RecursiveLocker lock(fLock); + MutexLocker lock(fLock); return fManager->Unbind(this); } @@ -491,7 +491,7 @@ TCPEndpoint::Listen(int count) { TRACE("Listen()"); - RecursiveLocker lock(fLock); + MutexLocker lock(fLock); if (fState != CLOSED) return B_BAD_VALUE; @@ -517,7 +517,7 @@ TCPEndpoint::Shutdown(int direction) { TRACE("Shutdown(%i)", direction); - RecursiveLocker lock(fLock); + MutexLocker lock(fLock); if (direction == SHUT_RD || direction == SHUT_RDWR) fFlags |= FLAG_NO_RECEIVE; @@ -535,7 +535,7 @@ TCPEndpoint::Shutdown(int direction) status_t TCPEndpoint::SendData(net_buffer *buffer) { - RecursiveLocker lock(fLock); + MutexLocker lock(fLock); TRACE("SendData(buffer %p, size %lu, flags %lx) [total %lu bytes, has %lu]", buffer, buffer->size, buffer->flags, fSendQueue.Size(), @@ -582,7 +582,7 @@ TCPEndpoint::SendData(net_buffer *buffer) ssize_t TCPEndpoint::SendAvailable() { - RecursiveLocker locker(fLock); + MutexLocker locker(fLock); ssize_t available; @@ -599,7 +599,7 @@ TCPEndpoint::SendAvailable() status_t TCPEndpoint::FillStat(net_stat *stat) { - RecursiveLocker _(fLock); + MutexLocker _(fLock); strlcpy(stat->state, name_for_state(fState), sizeof(stat->state)); stat->receive_queue_size = fReceiveQueue.Available(); @@ -614,7 +614,7 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) { TRACE("ReadData(%lu bytes, flags 0x%x)", numBytes, (unsigned int)flags); - RecursiveLocker locker(fLock); + MutexLocker locker(fLock); *_buffer = NULL; @@ -698,7 +698,7 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) ssize_t TCPEndpoint::ReadAvailable() { - RecursiveLocker locker(fLock); + MutexLocker locker(fLock); TRACE("ReadAvailable(): %li", _AvailableData()); @@ -709,7 +709,7 @@ TCPEndpoint::ReadAvailable() status_t TCPEndpoint::SetSendBufferSize(size_t length) { - RecursiveLocker _(fLock); + MutexLocker _(fLock); fSendQueue.SetMaxBytes(length); return B_OK; } @@ -718,7 +718,7 @@ TCPEndpoint::SetSendBufferSize(size_t length) status_t TCPEndpoint::SetReceiveBufferSize(size_t length) { - RecursiveLocker _(fLock); + MutexLocker _(fLock); fReceiveQueue.SetMaxBytes(length); return B_OK; } @@ -735,7 +735,7 @@ TCPEndpoint::SetOption(int option, const void *_value, int length) const int *value = (const int *)_value; - RecursiveLocker _(fLock); + MutexLocker _(fLock); if (*value) fOptions |= TCP_NODELAY; else @@ -844,7 +844,7 @@ int32 TCPEndpoint::Spawn(TCPEndpoint *parent, tcp_segment_header &segment, net_buffer *buffer) { - RecursiveLocker _(fLock); + MutexLocker _(fLock); // TODO error checking ProtocolSocket::Open(); @@ -883,8 +883,7 @@ TCPEndpoint::Spawn(TCPEndpoint *parent, tcp_segment_header &segment, void TCPEndpoint::DumpInternalState() const { - kprintf("Lock: { sem: %ld, holder: %ld, recursion: %i }\n", - fLock.sem, fLock.holder, fLock.recursion); + kprintf("Lock: { sem: %ld, holder: %ld }\n", fLock.sem, fLock.holder); kprintf("AcceptSem: %ld\n", fAcceptSemaphore); kprintf("Options: 0x%lx\n", (uint32)fOptions); kprintf("SendWindowShift: %lu\n", (uint32)fSendWindowShift); @@ -955,7 +954,7 @@ TCPEndpoint::_SynchronizeSentReceive(tcp_segment_header &segment, net_buffer *bu int32 TCPEndpoint::SegmentReceived(tcp_segment_header &segment, net_buffer *buffer) { - RecursiveLocker locker(fLock); + MutexLocker locker(fLock); TRACE("SegmentReceived(): buffer %p (%lu bytes) address %s to %s", buffer, buffer->size, PrintAddress(buffer->source), @@ -1628,7 +1627,7 @@ TCPEndpoint::_MarkEstablished() status_t -TCPEndpoint::_WaitForEstablished(RecursiveLocker &locker, bigtime_t timeout) +TCPEndpoint::_WaitForEstablished(MutexLocker &locker, bigtime_t timeout) { while (fState != ESTABLISHED) { status_t status = fSendList.Wait(locker, timeout); @@ -1843,7 +1842,7 @@ TCPEndpoint::_RetransmitTimer(net_timer *timer, void *data) { TCPEndpoint *endpoint = (TCPEndpoint *)data; - RecursiveLocker locker(endpoint->fLock); + MutexLocker locker(endpoint->fLock); if (!locker.IsLocked()) return; @@ -1856,7 +1855,7 @@ TCPEndpoint::_PersistTimer(net_timer *timer, void *data) { TCPEndpoint *endpoint = (TCPEndpoint *)data; - RecursiveLocker locker(endpoint->fLock); + MutexLocker locker(endpoint->fLock); if (!locker.IsLocked()) return; @@ -1869,7 +1868,7 @@ TCPEndpoint::_DelayedAcknowledgeTimer(struct net_timer *timer, void *data) { TCPEndpoint *endpoint = (TCPEndpoint *)data; - RecursiveLocker locker(endpoint->fLock); + MutexLocker locker(endpoint->fLock); if (!locker.IsLocked()) return; @@ -1882,7 +1881,7 @@ TCPEndpoint::_TimeWaitTimer(struct net_timer *timer, void *data) { TCPEndpoint *endpoint = (TCPEndpoint *)data; - if (recursive_lock_lock(&endpoint->fLock) < B_OK) + if (mutex_lock(&endpoint->fLock) < B_OK) return; endpoint->DeleteSocket(); diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h index a10409195a..c88efe5d14 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h @@ -32,7 +32,7 @@ public: status_t InitCheck() const; - status_t Wait(RecursiveLocker &, bigtime_t timeout, bool wakeNext = true); + status_t Wait(MutexLocker &, bigtime_t timeout, bool wakeNext = true); void Signal(); private: @@ -107,7 +107,7 @@ class TCPEndpoint : public net_protocol, public ProtocolSocket { void _UpdateTimestamps(tcp_segment_header& segment, size_t segmentLength); void _MarkEstablished(); - status_t _WaitForEstablished(RecursiveLocker &lock, bigtime_t timeout); + status_t _WaitForEstablished(MutexLocker &lock, bigtime_t timeout); void _AddData(tcp_segment_header &segment, net_buffer *buffer); void _PrepareReceivePath(tcp_segment_header &segment); status_t _PrepareSendPath(const sockaddr *peer); @@ -130,7 +130,7 @@ class TCPEndpoint : public net_protocol, public ProtocolSocket { friend class ConnectionHashDefinition; friend class EndpointHashDefinition; - recursive_lock fLock; + mutex fLock; WaitList fReceiveList; WaitList fSendList; sem_id fAcceptSemaphore; diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp index 23659d441c..fd88a72d4a 100644 --- a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp @@ -53,7 +53,7 @@ net_stack_module_info *gStackModule; // protocol cookie, so we don't have to go through the list // for each segment. typedef DoublyLinkedList EndpointManagerList; -static recursive_lock sEndpointManagersLock; +static mutex sEndpointManagersLock; static EndpointManagerList sEndpointManagers; @@ -633,7 +633,7 @@ tcp_receive_data(net_buffer *buffer) bufferHeader.Remove(headerLength); // we no longer need to keep the header around - RecursiveLocker _(sEndpointManagersLock); + MutexLocker _(sEndpointManagersLock); EndpointManager *endpointManager = endpoint_manager_for(domain); if (endpointManager == NULL) @@ -707,7 +707,7 @@ dump_endpoint(int argc, char *argv[]) static status_t tcp_init() { - status_t status = recursive_lock_init(&sEndpointManagersLock, + status_t status = mutex_init(&sEndpointManagersLock, "endpoint managers lock"); if (status < B_OK) @@ -746,7 +746,7 @@ tcp_uninit() { remove_debugger_command("tcp_endpoint", dump_endpoint); remove_debugger_command("tcp_endpoints", dump_endpoints); - recursive_lock_destroy(&sEndpointManagersLock); + mutex_destroy(&sEndpointManagersLock); return B_OK; }