UDP: apply review comments from hrev51603
I found this at the bottom of my TODO list… - UdpDomainSupport methods were referring to the object through a static variable when they could just use the "this" object instead. - Use BAutoDeleter to simplify the code a little - Style problem (missing != NULL in pointer check) - Move referencing of domainSupport in _GetDomainSupport instead of OpenEndpoint. This way the two _GetDomainSupport methods both return an already referenced object Thanks to Axel for the code review and sorry for the super late reply. Change-Id: Ic50ebb1a63a203d5aa393d28f4631c345acacc79 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3908 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
Adrien Destugues
parent
049eb4cb89
commit
cb3199681e
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2010, Haiku, Inc. All Rights Reserved.
|
||||
* Copyright 2006-2021, Haiku, Inc. All Rights Reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <util/DoublyLinkedList.h>
|
||||
#include <util/OpenHashTable.h>
|
||||
|
||||
#include <AutoDeleter.h>
|
||||
#include <KernelExport.h>
|
||||
|
||||
#include <NetBufferUtilities.h>
|
||||
@@ -699,6 +700,24 @@ UdpEndpointManager::DumpEndpoints(int argc, char *argv[])
|
||||
// #pragma mark - inbound
|
||||
|
||||
|
||||
struct DomainSupportDelete
|
||||
{
|
||||
inline void operator()(UdpDomainSupport* object)
|
||||
{
|
||||
sUdpEndpointManager->FreeEndpoint(object);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct DomainSupportDeleter
|
||||
: BPrivate::AutoDeleter<UdpDomainSupport, DomainSupportDelete>
|
||||
{
|
||||
DomainSupportDeleter(UdpDomainSupport* object)
|
||||
: BPrivate::AutoDeleter<UdpDomainSupport, DomainSupportDelete>(object)
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
status_t
|
||||
UdpEndpointManager::ReceiveData(net_buffer *buffer)
|
||||
{
|
||||
@@ -710,10 +729,10 @@ UdpEndpointManager::ReceiveData(net_buffer *buffer)
|
||||
// we are only interested in delivering data to existing sockets.
|
||||
return B_ERROR;
|
||||
}
|
||||
DomainSupportDeleter deleter(domainSupport);
|
||||
|
||||
status_t status = Deframe(buffer);
|
||||
if (status != B_OK) {
|
||||
sUdpEndpointManager->FreeEndpoint(domainSupport);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -723,12 +742,10 @@ UdpEndpointManager::ReceiveData(net_buffer *buffer)
|
||||
// Send port unreachable error
|
||||
domainSupport->Domain()->module->error_reply(NULL, buffer,
|
||||
B_NET_ERROR_UNREACH_PORT, NULL);
|
||||
sUdpEndpointManager->FreeEndpoint(domainSupport);
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
gBufferModule->free(buffer);
|
||||
sUdpEndpointManager->FreeEndpoint(domainSupport);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
@@ -749,13 +766,13 @@ UdpEndpointManager::ReceiveError(status_t error, net_buffer* buffer)
|
||||
// we are only interested in delivering data to existing sockets.
|
||||
return B_ERROR;
|
||||
}
|
||||
DomainSupportDeleter deleter(domainSupport);
|
||||
|
||||
// Deframe the buffer manually, as we usually only get 8 bytes from the
|
||||
// original packet
|
||||
udp_header header;
|
||||
if (gBufferModule->read(buffer, 0, &header,
|
||||
std::min((size_t)buffer->size, sizeof(udp_header))) != B_OK) {
|
||||
sUdpEndpointManager->FreeEndpoint(domainSupport);
|
||||
return B_BAD_VALUE;
|
||||
}
|
||||
|
||||
@@ -769,7 +786,6 @@ UdpEndpointManager::ReceiveError(status_t error, net_buffer* buffer)
|
||||
destination.SetPort(header.destination_port);
|
||||
|
||||
error = domainSupport->DeliverError(error, buffer);
|
||||
sUdpEndpointManager->FreeEndpoint(domainSupport);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -835,8 +851,6 @@ UdpEndpointManager::OpenEndpoint(UdpEndpoint *endpoint)
|
||||
MutexLocker _(fLock);
|
||||
|
||||
UdpDomainSupport* domain = _GetDomainSupport(endpoint->Domain(), true);
|
||||
if (domain)
|
||||
domain->Ref();
|
||||
return domain;
|
||||
}
|
||||
|
||||
@@ -884,8 +898,10 @@ UdpEndpointManager::_GetDomainSupport(net_domain* domain, bool create)
|
||||
// family.
|
||||
UdpDomainList::Iterator iterator = fDomains.GetIterator();
|
||||
while (UdpDomainSupport* domainSupport = iterator.Next()) {
|
||||
if (domainSupport->Domain() == domain)
|
||||
if (domainSupport->Domain() == domain) {
|
||||
domainSupport->Ref();
|
||||
return domainSupport;
|
||||
}
|
||||
}
|
||||
|
||||
if (!create)
|
||||
@@ -899,6 +915,7 @@ UdpEndpointManager::_GetDomainSupport(net_domain* domain, bool create)
|
||||
}
|
||||
|
||||
fDomains.Add(domainSupport);
|
||||
domainSupport->Ref();
|
||||
return domainSupport;
|
||||
}
|
||||
|
||||
@@ -913,7 +930,7 @@ UdpEndpointManager::_GetDomainSupport(net_buffer* buffer)
|
||||
MutexLocker _(fLock);
|
||||
|
||||
UdpDomainSupport* support = _GetDomainSupport(_GetDomain(buffer), false);
|
||||
if (support)
|
||||
if (support != NULL)
|
||||
support->Ref();
|
||||
return support;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user