LibCore: Own addrinfo results without OwnPtr
Store the getaddrinfo result pointer directly in AddressInfoVector and free it with freeaddrinfo from the destructor. This keeps the special cleanup logic local to LibCore instead of relying on OwnPtr custom deleter support.
This commit is contained in:
parent
2464e2ebfa
commit
0fca7d1a6e
2 changed files with 27 additions and 12 deletions
|
|
@ -18,16 +18,26 @@ namespace Core::System {
|
|||
|
||||
AddressInfoVector::AddressInfoVector(Vector<struct addrinfo> addresses, struct addrinfo* ptr)
|
||||
: m_addresses(move(addresses))
|
||||
, m_ptr(adopt_own_if_nonnull(ptr))
|
||||
, m_ptr(ptr)
|
||||
{
|
||||
}
|
||||
|
||||
AddressInfoVector::~AddressInfoVector() = default;
|
||||
|
||||
void AddressInfoVector::AddrInfoDeleter::operator()(struct addrinfo* ptr)
|
||||
AddressInfoVector::AddressInfoVector(AddressInfoVector&& other)
|
||||
: m_addresses(move(other.m_addresses))
|
||||
, m_ptr(exchange(other.m_ptr, nullptr))
|
||||
{
|
||||
if (ptr)
|
||||
::freeaddrinfo(ptr);
|
||||
}
|
||||
|
||||
AddressInfoVector::~AddressInfoVector()
|
||||
{
|
||||
if (m_ptr)
|
||||
::freeaddrinfo(m_ptr);
|
||||
}
|
||||
|
||||
void AddressInfoVector::swap(AddressInfoVector& other)
|
||||
{
|
||||
AK::swap(m_addresses, other.m_addresses);
|
||||
AK::swap(m_ptr, other.m_ptr);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/Noncopyable.h>
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/StdLibExtras.h>
|
||||
#include <AK/Vector.h>
|
||||
|
||||
struct addrinfo;
|
||||
|
|
@ -16,21 +16,26 @@ namespace Core::System {
|
|||
|
||||
class AddressInfoVector {
|
||||
AK_MAKE_NONCOPYABLE(AddressInfoVector);
|
||||
AK_MAKE_DEFAULT_MOVABLE(AddressInfoVector);
|
||||
|
||||
public:
|
||||
AddressInfoVector(Vector<struct addrinfo> addresses, struct addrinfo* ptr);
|
||||
AddressInfoVector(AddressInfoVector&& other);
|
||||
~AddressInfoVector();
|
||||
|
||||
AddressInfoVector& operator=(AddressInfoVector&& other)
|
||||
{
|
||||
AddressInfoVector temporary { move(other) };
|
||||
swap(temporary);
|
||||
return *this;
|
||||
}
|
||||
|
||||
ReadonlySpan<struct addrinfo> addresses() const { return m_addresses; }
|
||||
|
||||
private:
|
||||
struct AddrInfoDeleter {
|
||||
void operator()(struct addrinfo*);
|
||||
};
|
||||
void swap(AddressInfoVector& other);
|
||||
|
||||
Vector<struct addrinfo> m_addresses;
|
||||
OwnPtr<struct addrinfo, AddrInfoDeleter> m_ptr;
|
||||
struct addrinfo* m_ptr { nullptr };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue