mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:17:44 +00:00
Kernel: Use KResultOr<size_t> for the DoubleBuffer class
This commit is contained in:
parent
1c3346e3ce
commit
ca3cae81eb
4 changed files with 31 additions and 31 deletions
|
@ -40,7 +40,7 @@ void DoubleBuffer::flip()
|
||||||
compute_lockfree_metadata();
|
compute_lockfree_metadata();
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t DoubleBuffer::write(const UserOrKernelBuffer& data, size_t size)
|
KResultOr<size_t> DoubleBuffer::write(const UserOrKernelBuffer& data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size || m_storage.is_null())
|
if (!size || m_storage.is_null())
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -48,15 +48,15 @@ ssize_t DoubleBuffer::write(const UserOrKernelBuffer& data, size_t size)
|
||||||
size_t bytes_to_write = min(size, m_space_for_writing);
|
size_t bytes_to_write = min(size, m_space_for_writing);
|
||||||
u8* write_ptr = m_write_buffer->data + m_write_buffer->size;
|
u8* write_ptr = m_write_buffer->data + m_write_buffer->size;
|
||||||
if (!data.read(write_ptr, bytes_to_write))
|
if (!data.read(write_ptr, bytes_to_write))
|
||||||
return -EFAULT;
|
return EFAULT;
|
||||||
m_write_buffer->size += bytes_to_write;
|
m_write_buffer->size += bytes_to_write;
|
||||||
compute_lockfree_metadata();
|
compute_lockfree_metadata();
|
||||||
if (m_unblock_callback && !m_empty)
|
if (m_unblock_callback && !m_empty)
|
||||||
m_unblock_callback();
|
m_unblock_callback();
|
||||||
return (ssize_t)bytes_to_write;
|
return bytes_to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
KResultOr<size_t> DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size || m_storage.is_null())
|
if (!size || m_storage.is_null())
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -67,15 +67,15 @@ ssize_t DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
||||||
return 0;
|
return 0;
|
||||||
size_t nread = min(m_read_buffer->size - m_read_buffer_index, size);
|
size_t nread = min(m_read_buffer->size - m_read_buffer_index, size);
|
||||||
if (!data.write(m_read_buffer->data + m_read_buffer_index, nread))
|
if (!data.write(m_read_buffer->data + m_read_buffer_index, nread))
|
||||||
return -EFAULT;
|
return EFAULT;
|
||||||
m_read_buffer_index += nread;
|
m_read_buffer_index += nread;
|
||||||
compute_lockfree_metadata();
|
compute_lockfree_metadata();
|
||||||
if (m_unblock_callback && m_space_for_writing > 0)
|
if (m_unblock_callback && m_space_for_writing > 0)
|
||||||
m_unblock_callback();
|
m_unblock_callback();
|
||||||
return (ssize_t)nread;
|
return nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t DoubleBuffer::peek(UserOrKernelBuffer& data, size_t size)
|
KResultOr<size_t> DoubleBuffer::peek(UserOrKernelBuffer& data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size || m_storage.is_null())
|
if (!size || m_storage.is_null())
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -87,11 +87,11 @@ ssize_t DoubleBuffer::peek(UserOrKernelBuffer& data, size_t size)
|
||||||
return 0;
|
return 0;
|
||||||
size_t nread = min(m_read_buffer->size - m_read_buffer_index, size);
|
size_t nread = min(m_read_buffer->size - m_read_buffer_index, size);
|
||||||
if (!data.write(m_read_buffer->data + m_read_buffer_index, nread))
|
if (!data.write(m_read_buffer->data + m_read_buffer_index, nread))
|
||||||
return -EFAULT;
|
return EFAULT;
|
||||||
compute_lockfree_metadata();
|
compute_lockfree_metadata();
|
||||||
if (m_unblock_callback && m_space_for_writing > 0)
|
if (m_unblock_callback && m_space_for_writing > 0)
|
||||||
m_unblock_callback();
|
m_unblock_callback();
|
||||||
return (ssize_t)nread;
|
return nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,19 +18,19 @@ class DoubleBuffer {
|
||||||
public:
|
public:
|
||||||
explicit DoubleBuffer(size_t capacity = 65536);
|
explicit DoubleBuffer(size_t capacity = 65536);
|
||||||
|
|
||||||
[[nodiscard]] ssize_t write(const UserOrKernelBuffer&, size_t);
|
[[nodiscard]] KResultOr<size_t> write(const UserOrKernelBuffer&, size_t);
|
||||||
[[nodiscard]] ssize_t write(const u8* data, size_t size)
|
[[nodiscard]] KResultOr<size_t> write(const u8* data, size_t size)
|
||||||
{
|
{
|
||||||
return write(UserOrKernelBuffer::for_kernel_buffer(const_cast<u8*>(data)), size);
|
return write(UserOrKernelBuffer::for_kernel_buffer(const_cast<u8*>(data)), size);
|
||||||
}
|
}
|
||||||
[[nodiscard]] ssize_t read(UserOrKernelBuffer&, size_t);
|
[[nodiscard]] KResultOr<size_t> read(UserOrKernelBuffer&, size_t);
|
||||||
[[nodiscard]] ssize_t read(u8* data, size_t size)
|
[[nodiscard]] KResultOr<size_t> read(u8* data, size_t size)
|
||||||
{
|
{
|
||||||
auto buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
auto buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
||||||
return read(buffer, size);
|
return read(buffer, size);
|
||||||
}
|
}
|
||||||
[[nodiscard]] ssize_t peek(UserOrKernelBuffer&, size_t);
|
[[nodiscard]] KResultOr<size_t> peek(UserOrKernelBuffer&, size_t);
|
||||||
[[nodiscard]] ssize_t peek(u8* data, size_t size)
|
[[nodiscard]] KResultOr<size_t> peek(u8* data, size_t size)
|
||||||
{
|
{
|
||||||
auto buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
auto buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
||||||
return peek(buffer, size);
|
return peek(buffer, size);
|
||||||
|
|
|
@ -270,17 +270,17 @@ KResultOr<size_t> IPv4Socket::receive_byte_buffered(FileDescription& description
|
||||||
|
|
||||||
VERIFY(!m_receive_buffer.is_empty());
|
VERIFY(!m_receive_buffer.is_empty());
|
||||||
|
|
||||||
int nreceived;
|
KResultOr<size_t> nreceived_or_error { 0 };
|
||||||
if (flags & MSG_PEEK)
|
if (flags & MSG_PEEK)
|
||||||
nreceived = m_receive_buffer.peek(buffer, buffer_length);
|
nreceived_or_error = m_receive_buffer.peek(buffer, buffer_length);
|
||||||
else
|
else
|
||||||
nreceived = m_receive_buffer.read(buffer, buffer_length);
|
nreceived_or_error = m_receive_buffer.read(buffer, buffer_length);
|
||||||
|
|
||||||
if (nreceived > 0 && !(flags & MSG_PEEK))
|
if (!nreceived_or_error.is_error() && nreceived_or_error.value() > 0 && !(flags & MSG_PEEK))
|
||||||
Thread::current()->did_ipv4_socket_read((size_t)nreceived);
|
Thread::current()->did_ipv4_socket_read(nreceived_or_error.value());
|
||||||
|
|
||||||
set_can_read(!m_receive_buffer.is_empty());
|
set_can_read(!m_receive_buffer.is_empty());
|
||||||
return nreceived;
|
return nreceived_or_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> addr, Userspace<socklen_t*> addr_length, Time& packet_timestamp)
|
KResultOr<size_t> IPv4Socket::receive_packet_buffered(FileDescription& description, UserOrKernelBuffer& buffer, size_t buffer_length, int flags, Userspace<sockaddr*> addr, Userspace<socklen_t*> addr_length, Time& packet_timestamp)
|
||||||
|
@ -418,8 +418,8 @@ bool IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port,
|
||||||
auto nreceived_or_error = protocol_receive(ReadonlyBytes { packet.data(), packet.size() }, scratch_buffer, m_scratch_buffer.value().size(), 0);
|
auto nreceived_or_error = protocol_receive(ReadonlyBytes { packet.data(), packet.size() }, scratch_buffer, m_scratch_buffer.value().size(), 0);
|
||||||
if (nreceived_or_error.is_error())
|
if (nreceived_or_error.is_error())
|
||||||
return false;
|
return false;
|
||||||
ssize_t nwritten = m_receive_buffer.write(scratch_buffer, nreceived_or_error.value());
|
auto nwritten_or_error = m_receive_buffer.write(scratch_buffer, nreceived_or_error.value());
|
||||||
if (nwritten < 0)
|
if (nwritten_or_error.is_error())
|
||||||
return false;
|
return false;
|
||||||
set_can_read(!m_receive_buffer.is_empty());
|
set_can_read(!m_receive_buffer.is_empty());
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -293,10 +293,10 @@ KResultOr<size_t> LocalSocket::sendto(FileDescription& description, const UserOr
|
||||||
auto* socket_buffer = send_buffer_for(description);
|
auto* socket_buffer = send_buffer_for(description);
|
||||||
if (!socket_buffer)
|
if (!socket_buffer)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
ssize_t nwritten = socket_buffer->write(data, data_size);
|
auto nwritten_or_error = socket_buffer->write(data, data_size);
|
||||||
if (nwritten > 0)
|
if (!nwritten_or_error.is_error() && nwritten_or_error.value() > 0)
|
||||||
Thread::current()->did_unix_socket_write(nwritten);
|
Thread::current()->did_unix_socket_write(nwritten_or_error.value());
|
||||||
return nwritten;
|
return nwritten_or_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
DoubleBuffer* LocalSocket::receive_buffer_for(FileDescription& description)
|
DoubleBuffer* LocalSocket::receive_buffer_for(FileDescription& description)
|
||||||
|
@ -338,10 +338,10 @@ KResultOr<size_t> LocalSocket::recvfrom(FileDescription& description, UserOrKern
|
||||||
if (!has_attached_peer(description) && socket_buffer->is_empty())
|
if (!has_attached_peer(description) && socket_buffer->is_empty())
|
||||||
return 0;
|
return 0;
|
||||||
VERIFY(!socket_buffer->is_empty());
|
VERIFY(!socket_buffer->is_empty());
|
||||||
auto nread = socket_buffer->read(buffer, buffer_size);
|
auto nread_or_error = socket_buffer->read(buffer, buffer_size);
|
||||||
if (nread > 0)
|
if (!nread_or_error.is_error() && nread_or_error.value() > 0)
|
||||||
Thread::current()->did_unix_socket_read(nread);
|
Thread::current()->did_unix_socket_read(nread_or_error.value());
|
||||||
return nread;
|
return nread_or_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
StringView LocalSocket::socket_path() const
|
StringView LocalSocket::socket_path() const
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue