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:
Andreas Kling 2026-06-13 19:46:15 +02:00 committed by Andreas Kling
parent 2464e2ebfa
commit 0fca7d1a6e
2 changed files with 27 additions and 12 deletions

View file

@ -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);
}
}

View file

@ -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 };
};
}