mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:27:35 +00:00
Kernel: Implement peek() function for DoubleBuffer
This allows us to "peek" into a DoubleBuffer without incrementing the m_read_buffer_index, which is needed to implement MSG_PEEK.
This commit is contained in:
parent
9bcdbe205b
commit
2d098c88dc
2 changed files with 25 additions and 2 deletions
|
@ -44,7 +44,6 @@ ssize_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;
|
||||||
VERIFY(size > 0);
|
|
||||||
Locker locker(m_lock);
|
Locker locker(m_lock);
|
||||||
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;
|
||||||
|
@ -61,7 +60,6 @@ ssize_t DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size || m_storage.is_null())
|
if (!size || m_storage.is_null())
|
||||||
return 0;
|
return 0;
|
||||||
VERIFY(size > 0);
|
|
||||||
Locker locker(m_lock);
|
Locker locker(m_lock);
|
||||||
if (m_read_buffer_index >= m_read_buffer->size && m_write_buffer->size != 0)
|
if (m_read_buffer_index >= m_read_buffer->size && m_write_buffer->size != 0)
|
||||||
flip();
|
flip();
|
||||||
|
@ -77,4 +75,23 @@ ssize_t DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
||||||
return (ssize_t)nread;
|
return (ssize_t)nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t DoubleBuffer::peek(UserOrKernelBuffer& data, size_t size)
|
||||||
|
{
|
||||||
|
if (!size || m_storage.is_null())
|
||||||
|
return 0;
|
||||||
|
Locker locker(m_lock);
|
||||||
|
if (m_read_buffer_index >= m_read_buffer->size && m_write_buffer->size != 0) {
|
||||||
|
flip();
|
||||||
|
}
|
||||||
|
if (m_read_buffer_index >= m_read_buffer->size)
|
||||||
|
return 0;
|
||||||
|
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))
|
||||||
|
return -EFAULT;
|
||||||
|
compute_lockfree_metadata();
|
||||||
|
if (m_unblock_callback && m_space_for_writing > 0)
|
||||||
|
m_unblock_callback();
|
||||||
|
return (ssize_t)nread;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,12 @@ public:
|
||||||
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]] ssize_t peek(u8* data, size_t size)
|
||||||
|
{
|
||||||
|
auto buffer = UserOrKernelBuffer::for_kernel_buffer(data);
|
||||||
|
return peek(buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
bool is_empty() const { return m_empty; }
|
bool is_empty() const { return m_empty; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue