event/ServerSocket: use AllocatedSocketAddress for OneServerSocket::address
Manages memory automatically.
This commit is contained in:
parent
f084bbbf35
commit
fdeec0307e
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user