mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 08:41:15 +00:00
Kernel: Allow short writes to DoubleBuffer
DoubleBuffer is the internal buffer for things like TTY, FIFO, sockets, etc. If you try to write more than the buffer can hold, it will now do a short write instead of asserting. This is likely to expose issues at higher levels, and we'll have to deal with them as they are discovered.
This commit is contained in:
parent
c44b4d61f3
commit
f2846e8e08
Notes:
sideshowbarker
2024-07-19 09:44:13 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/f2846e8e08e
|
@ -59,19 +59,21 @@ ssize_t DoubleBuffer::write(const u8* data, ssize_t size)
|
||||||
{
|
{
|
||||||
if (!size)
|
if (!size)
|
||||||
return 0;
|
return 0;
|
||||||
|
ASSERT(size > 0);
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
ASSERT(size <= (ssize_t)space_for_writing());
|
ssize_t bytes_to_write = min(static_cast<size_t>(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;
|
||||||
m_write_buffer->size += size;
|
m_write_buffer->size += bytes_to_write;
|
||||||
compute_lockfree_metadata();
|
compute_lockfree_metadata();
|
||||||
memcpy(write_ptr, data, size);
|
memcpy(write_ptr, data, bytes_to_write);
|
||||||
return size;
|
return bytes_to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t DoubleBuffer::read(u8* data, ssize_t size)
|
ssize_t DoubleBuffer::read(u8* data, ssize_t size)
|
||||||
{
|
{
|
||||||
if (!size)
|
if (!size)
|
||||||
return 0;
|
return 0;
|
||||||
|
ASSERT(size > 0);
|
||||||
LOCKER(m_lock);
|
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();
|
||||||
|
|
Loading…
Reference in a new issue