1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:47:36 +00:00

Kernel: Add SocketHandle helper class that wraps locked sockets.

This allows us to have a comfy IPv4Socket::from_tcp_port() API that returns
a socket that's locked and safe to access. No need to worry about locking
at the client site.
This commit is contained in:
Andreas Kling 2019-03-14 09:19:24 +01:00
parent 3d5296a901
commit 54e7df0586
4 changed files with 106 additions and 22 deletions

View file

@ -7,6 +7,7 @@
#include <AK/Lock.h>
#include <AK/SinglyLinkedList.h>
class IPv4SocketHandle;
class NetworkAdapter;
class TCPPacket;
@ -28,6 +29,9 @@ public:
static Lockable<HashMap<word, IPv4Socket*>>& sockets_by_udp_port();
static Lockable<HashMap<word, IPv4Socket*>>& sockets_by_tcp_port();
static IPv4SocketHandle from_tcp_port(word);
static IPv4SocketHandle from_udp_port(word);
virtual KResult bind(const sockaddr*, socklen_t) override;
virtual KResult connect(const sockaddr*, socklen_t) override;
virtual bool get_address(sockaddr*, socklen_t*) override;
@ -79,3 +83,26 @@ private:
bool m_can_read { false };
};
class IPv4SocketHandle : public SocketHandle {
public:
IPv4SocketHandle() { }
IPv4SocketHandle(RetainPtr<IPv4Socket>&& socket)
: SocketHandle(move(socket))
{
}
IPv4SocketHandle(IPv4SocketHandle&& other)
: SocketHandle(move(other))
{
}
IPv4SocketHandle(const IPv4SocketHandle&) = delete;
IPv4SocketHandle& operator=(const IPv4SocketHandle&) = delete;
IPv4Socket* operator->() { return &socket(); }
const IPv4Socket* operator->() const { return &socket(); }
IPv4Socket& socket() { return static_cast<IPv4Socket&>(SocketHandle::socket()); }
const IPv4Socket& socket() const { return static_cast<const IPv4Socket&>(SocketHandle::socket()); }
};