1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-25 21:55:07 +00:00

Kernel: Prepare Socket for becoming a File.

Make the Socket functions take a FileDescriptor& rather than a socket role
throughout the code. Also change threads to block on a FileDescriptor,
rather than either an fd index or a Socket.
This commit is contained in:
Andreas Kling 2019-05-03 20:15:54 +02:00
parent 9f633a1871
commit 03da7046bd
14 changed files with 118 additions and 115 deletions

View file

@ -66,7 +66,7 @@ KResult IPv4Socket::bind(const sockaddr* address, socklen_t address_size)
ASSERT_NOT_REACHED();
}
KResult IPv4Socket::connect(const sockaddr* address, socklen_t address_size, ShouldBlock should_block)
KResult IPv4Socket::connect(FileDescriptor& descriptor, const sockaddr* address, socklen_t address_size, ShouldBlock should_block)
{
ASSERT(!m_bound);
if (address_size != sizeof(sockaddr_in))
@ -78,37 +78,37 @@ KResult IPv4Socket::connect(const sockaddr* address, socklen_t address_size, Sho
m_destination_address = IPv4Address((const byte*)&ia.sin_addr.s_addr);
m_destination_port = ntohs(ia.sin_port);
return protocol_connect(should_block);
return protocol_connect(descriptor, should_block);
}
void IPv4Socket::attach_fd(SocketRole)
void IPv4Socket::attach(FileDescriptor&)
{
++m_attached_fds;
}
void IPv4Socket::detach_fd(SocketRole)
void IPv4Socket::detach(FileDescriptor&)
{
--m_attached_fds;
}
bool IPv4Socket::can_read(SocketRole) const
bool IPv4Socket::can_read(FileDescriptor&) const
{
if (protocol_is_disconnected())
return true;
return m_can_read;
}
ssize_t IPv4Socket::read(SocketRole, byte* buffer, ssize_t size)
ssize_t IPv4Socket::read(FileDescriptor& descriptor, byte* buffer, ssize_t size)
{
return recvfrom(buffer, size, 0, nullptr, 0);
return recvfrom(descriptor, buffer, size, 0, nullptr, 0);
}
ssize_t IPv4Socket::write(SocketRole, const byte* data, ssize_t size)
ssize_t IPv4Socket::write(FileDescriptor& descriptor, const byte* data, ssize_t size)
{
return sendto(data, size, 0, nullptr, 0);
return sendto(descriptor, data, size, 0, nullptr, 0);
}
bool IPv4Socket::can_write(SocketRole) const
bool IPv4Socket::can_write(FileDescriptor&) const
{
return is_connected();
}
@ -124,7 +124,7 @@ int IPv4Socket::allocate_source_port_if_needed()
return port;
}
ssize_t IPv4Socket::sendto(const void* data, size_t data_length, int flags, const sockaddr* addr, socklen_t addr_length)
ssize_t IPv4Socket::sendto(FileDescriptor&, const void* data, size_t data_length, int flags, const sockaddr* addr, socklen_t addr_length)
{
(void)flags;
if (addr && addr_length != sizeof(sockaddr_in))
@ -159,7 +159,7 @@ ssize_t IPv4Socket::sendto(const void* data, size_t data_length, int flags, cons
return protocol_send(data, data_length);
}
ssize_t IPv4Socket::recvfrom(void* buffer, size_t buffer_length, int flags, sockaddr* addr, socklen_t* addr_length)
ssize_t IPv4Socket::recvfrom(FileDescriptor& descriptor, void* buffer, size_t buffer_length, int flags, sockaddr* addr, socklen_t* addr_length)
{
(void)flags;
if (addr_length && *addr_length < sizeof(sockaddr_in))
@ -186,9 +186,8 @@ ssize_t IPv4Socket::recvfrom(void* buffer, size_t buffer_length, int flags, sock
return 0;
}
current->set_blocked_socket(this);
load_receive_deadline();
current->block(Thread::BlockedReceive);
current->block(Thread::BlockedReceive, descriptor);
LOCKER(lock());
if (!m_can_read) {