1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:38:11 +00:00

LibCore+Userland+Tests: Convert Stream APIs to construct on heap

As per previous discussion, it was decided that the Stream classes
should be constructed on the heap.

While I don't personally agree with this change, it does have the
benefit of avoiding Function object reconstructions due to the lambda
passed to Notifier pointing to a stale object reference. This also has
the benefit of not having to "box" objects for virtual usage, as the
objects come pre-boxed.

However, it means that we now hit the heap everytime we construct a
TCPSocket for instance, which might not be desirable.
This commit is contained in:
sin-ack 2021-12-29 22:31:45 +00:00 committed by Ali Mohammad Pur
parent eb389db92c
commit dbd25916a3
14 changed files with 163 additions and 162 deletions

View file

@ -90,14 +90,14 @@ ErrorOr<off_t> SeekableStream::size()
return seek_result.value();
}
ErrorOr<File> File::open(StringView const& filename, OpenMode mode, mode_t permissions)
ErrorOr<NonnullOwnPtr<File>> File::open(StringView const& filename, OpenMode mode, mode_t permissions)
{
File file { mode };
TRY(file.open_path(filename, permissions));
auto file = TRY(adopt_nonnull_own_or_enomem(new (nothrow) File(mode)));
TRY(file->open_path(filename, permissions));
return file;
}
ErrorOr<File> File::adopt_fd(int fd, OpenMode mode)
ErrorOr<NonnullOwnPtr<File>> File::adopt_fd(int fd, OpenMode mode)
{
if (fd < 0) {
return Error::from_errno(EBADF);
@ -108,8 +108,8 @@ ErrorOr<File> File::adopt_fd(int fd, OpenMode mode)
return Error::from_errno(EINVAL);
}
File file { mode };
file.m_fd = fd;
auto file = TRY(adopt_nonnull_own_or_enomem(new (nothrow) File(mode)));
file->m_fd = fd;
return file;
}
@ -445,18 +445,18 @@ void PosixSocketHelper::setup_notifier()
m_notifier = Core::Notifier::construct(m_fd, Core::Notifier::Read);
}
ErrorOr<TCPSocket> TCPSocket::connect(String const& host, u16 port)
ErrorOr<NonnullOwnPtr<TCPSocket>> TCPSocket::connect(String const& host, u16 port)
{
auto ip_address = TRY(resolve_host(host, SocketType::Stream));
return connect(SocketAddress { ip_address, port });
}
ErrorOr<TCPSocket> TCPSocket::connect(SocketAddress const& address)
ErrorOr<NonnullOwnPtr<TCPSocket>> TCPSocket::connect(SocketAddress const& address)
{
TCPSocket socket;
auto socket = TRY(adopt_nonnull_own_or_enomem(new (nothrow) TCPSocket()));
auto fd = TRY(create_fd(SocketDomain::Inet, SocketType::Stream));
socket.m_helper.set_fd(fd);
socket->m_helper.set_fd(fd);
auto result = connect_inet(fd, address);
if (result.is_error()) {
@ -464,19 +464,19 @@ ErrorOr<TCPSocket> TCPSocket::connect(SocketAddress const& address)
return result.release_error();
}
socket.setup_notifier();
socket->setup_notifier();
return socket;
}
ErrorOr<TCPSocket> TCPSocket::adopt_fd(int fd)
ErrorOr<NonnullOwnPtr<TCPSocket>> TCPSocket::adopt_fd(int fd)
{
if (fd < 0) {
return Error::from_errno(EBADF);
}
TCPSocket socket;
socket.m_helper.set_fd(fd);
socket.setup_notifier();
auto socket = TRY(adopt_nonnull_own_or_enomem(new (nothrow) TCPSocket()));
socket->m_helper.set_fd(fd);
socket->setup_notifier();
return socket;
}
@ -495,18 +495,18 @@ ErrorOr<size_t> PosixSocketHelper::pending_bytes() const
return static_cast<size_t>(value);
}
ErrorOr<UDPSocket> UDPSocket::connect(String const& host, u16 port)
ErrorOr<NonnullOwnPtr<UDPSocket>> UDPSocket::connect(String const& host, u16 port)
{
auto ip_address = TRY(resolve_host(host, SocketType::Datagram));
return connect(SocketAddress { ip_address, port });
}
ErrorOr<UDPSocket> UDPSocket::connect(SocketAddress const& address)
ErrorOr<NonnullOwnPtr<UDPSocket>> UDPSocket::connect(SocketAddress const& address)
{
UDPSocket socket;
auto socket = TRY(adopt_nonnull_own_or_enomem(new (nothrow) UDPSocket()));
auto fd = TRY(create_fd(SocketDomain::Inet, SocketType::Datagram));
socket.m_helper.set_fd(fd);
socket->m_helper.set_fd(fd);
auto result = connect_inet(fd, address);
if (result.is_error()) {
@ -514,16 +514,16 @@ ErrorOr<UDPSocket> UDPSocket::connect(SocketAddress const& address)
return result.release_error();
}
socket.setup_notifier();
socket->setup_notifier();
return socket;
}
ErrorOr<LocalSocket> LocalSocket::connect(String const& path)
ErrorOr<NonnullOwnPtr<LocalSocket>> LocalSocket::connect(String const& path)
{
LocalSocket socket;
auto socket = TRY(adopt_nonnull_own_or_enomem(new (nothrow) LocalSocket()));
auto fd = TRY(create_fd(SocketDomain::Local, SocketType::Stream));
socket.m_helper.set_fd(fd);
socket->m_helper.set_fd(fd);
auto result = connect_local(fd, path);
if (result.is_error()) {
@ -531,7 +531,7 @@ ErrorOr<LocalSocket> LocalSocket::connect(String const& path)
return result.release_error();
}
socket.setup_notifier();
socket->setup_notifier();
return socket;
}