event/ServerSocket: use AllocatedSocketAddress for OneServerSocket::address

Manages memory automatically.
This commit is contained in:
Max Kellermann 2015-07-22 11:05:08 +02:00
parent f084bbbf35
commit fdeec0307e
2 changed files with 16 additions and 9 deletions

View File

@ -20,6 +20,7 @@
#include "config.h" #include "config.h"
#include "ServerSocket.hxx" #include "ServerSocket.hxx"
#include "net/StaticSocketAddress.hxx" #include "net/StaticSocketAddress.hxx"
#include "net/AllocatedSocketAddress.hxx"
#include "net/SocketAddress.hxx" #include "net/SocketAddress.hxx"
#include "net/SocketUtil.hxx" #include "net/SocketUtil.hxx"
#include "net/SocketError.hxx" #include "net/SocketError.hxx"
@ -64,31 +65,26 @@ class OneServerSocket final : private SocketMonitor {
AllocatedPath path; AllocatedPath path;
#endif #endif
SocketAddress address; const AllocatedSocketAddress address;
public: public:
template<typename A>
OneServerSocket(EventLoop &_loop, ServerSocket &_parent, OneServerSocket(EventLoop &_loop, ServerSocket &_parent,
unsigned _serial, unsigned _serial,
SocketAddress _address) A &&_address)
:SocketMonitor(_loop), :SocketMonitor(_loop),
parent(_parent), serial(_serial), parent(_parent), serial(_serial),
#ifdef HAVE_UN #ifdef HAVE_UN
path(AllocatedPath::Null()), path(AllocatedPath::Null()),
#endif #endif
address((sockaddr *)xmemdup(_address.GetAddress(), address(std::forward<A>(_address))
_address.GetSize()),
_address.GetSize())
{ {
assert(!_address.IsNull());
assert(_address.GetSize() > 0);
} }
OneServerSocket(const OneServerSocket &other) = delete; OneServerSocket(const OneServerSocket &other) = delete;
OneServerSocket &operator=(const OneServerSocket &other) = delete; OneServerSocket &operator=(const OneServerSocket &other) = delete;
~OneServerSocket() { ~OneServerSocket() {
free(const_cast<struct sockaddr *>(address.GetAddress()));
if (IsDefined()) if (IsDefined())
Close(); Close();
} }
@ -299,6 +295,15 @@ ServerSocket::AddAddress(SocketAddress address)
return sockets.back(); return sockets.back();
} }
OneServerSocket &
ServerSocket::AddAddress(AllocatedSocketAddress &&address)
{
sockets.emplace_back(loop, *this, next_serial,
std::move(address));
return sockets.back();
}
bool bool
ServerSocket::AddFD(int fd, Error &error) ServerSocket::AddFD(int fd, Error &error)
{ {

View File

@ -25,6 +25,7 @@
#include <stddef.h> #include <stddef.h>
class SocketAddress; class SocketAddress;
class AllocatedSocketAddress;
class EventLoop; class EventLoop;
class Error; class Error;
class AllocatedPath; class AllocatedPath;
@ -52,6 +53,7 @@ public:
private: private:
OneServerSocket &AddAddress(SocketAddress address); OneServerSocket &AddAddress(SocketAddress address);
OneServerSocket &AddAddress(AllocatedSocketAddress &&address);
/** /**
* Add a listener on a port on all IPv4 interfaces. * Add a listener on a port on all IPv4 interfaces.