mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:17:35 +00:00
Kernel: Share code between DoubleBuffer's read() and peek()
The only difference between these is whether the buffer index is advanced after the read.
This commit is contained in:
parent
9387271049
commit
b820ae2828
2 changed files with 13 additions and 17 deletions
|
@ -60,40 +60,34 @@ ErrorOr<size_t> DoubleBuffer::write(const UserOrKernelBuffer& data, size_t size)
|
||||||
return bytes_to_write;
|
return bytes_to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<size_t> DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
ErrorOr<size_t> DoubleBuffer::read_impl(UserOrKernelBuffer& data, size_t size, MutexLocker&, bool advance_buffer_index)
|
||||||
{
|
{
|
||||||
if (!size)
|
if (size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
MutexLocker 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();
|
||||||
if (m_read_buffer_index >= m_read_buffer->size)
|
if (m_read_buffer_index >= m_read_buffer->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);
|
||||||
TRY(data.write(m_read_buffer->data + m_read_buffer_index, nread));
|
TRY(data.write(m_read_buffer->data + m_read_buffer_index, nread));
|
||||||
m_read_buffer_index += nread;
|
if (advance_buffer_index)
|
||||||
|
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 nread;
|
return nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<size_t> DoubleBuffer::read(UserOrKernelBuffer& data, size_t size)
|
||||||
|
{
|
||||||
|
MutexLocker locker(m_lock);
|
||||||
|
return read_impl(data, size, locker, true);
|
||||||
|
}
|
||||||
|
|
||||||
ErrorOr<size_t> DoubleBuffer::peek(UserOrKernelBuffer& data, size_t size)
|
ErrorOr<size_t> DoubleBuffer::peek(UserOrKernelBuffer& data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size)
|
|
||||||
return 0;
|
|
||||||
MutexLocker locker(m_lock);
|
MutexLocker locker(m_lock);
|
||||||
if (m_read_buffer_index >= m_read_buffer->size && m_write_buffer->size != 0) {
|
return read_impl(data, size, locker, false);
|
||||||
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);
|
|
||||||
TRY(data.write(m_read_buffer->data + m_read_buffer_index, nread));
|
|
||||||
compute_lockfree_metadata();
|
|
||||||
if (m_unblock_callback && m_space_for_writing > 0)
|
|
||||||
m_unblock_callback();
|
|
||||||
return nread;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,8 @@ private:
|
||||||
void flip();
|
void flip();
|
||||||
void compute_lockfree_metadata();
|
void compute_lockfree_metadata();
|
||||||
|
|
||||||
|
ErrorOr<size_t> read_impl(UserOrKernelBuffer&, size_t, MutexLocker&, bool advance_buffer_index);
|
||||||
|
|
||||||
struct InnerBuffer {
|
struct InnerBuffer {
|
||||||
u8* data { nullptr };
|
u8* data { nullptr };
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue