mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-16 16:12:53 +00:00
Everywhere: Move global Kernel pattern code to Kernel/Library directory
This has KString, KBuffer, DoubleBuffer, KBufferBuilder, IOWindow, UserOrKernelBuffer and ScopedCritical classes being moved to the Kernel/Library subdirectory. Also, move the panic and assertions handling code to that directory.
This commit is contained in:
parent
f1cbfc5a6e
commit
7c0540a229
Notes:
sideshowbarker
2024-07-17 00:53:02 +09:00
Author: https://github.com/supercomputer7
Commit: 7c0540a229
Pull-request: https://github.com/SerenityOS/serenity/pull/17604
Reviewed-by: https://github.com/gmta ✅
Reviewed-by: https://github.com/kleinesfilmroellchen ✅
193 changed files with 238 additions and 240 deletions
93
Kernel/Library/DoubleBuffer.cpp
Normal file
93
Kernel/Library/DoubleBuffer.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <AK/StringView.h>
|
||||
#include <Kernel/InterruptDisabler.h>
|
||||
#include <Kernel/Library/DoubleBuffer.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
inline void DoubleBuffer::compute_lockfree_metadata()
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
m_empty = m_read_buffer_index >= m_read_buffer->size && m_write_buffer->size == 0;
|
||||
m_space_for_writing = m_capacity - m_write_buffer->size;
|
||||
}
|
||||
|
||||
ErrorOr<NonnullOwnPtr<DoubleBuffer>> DoubleBuffer::try_create(StringView name, size_t capacity)
|
||||
{
|
||||
auto storage = TRY(KBuffer::try_create_with_size(name, capacity * 2, Memory::Region::Access::ReadWrite));
|
||||
return adopt_nonnull_own_or_enomem(new (nothrow) DoubleBuffer(capacity, move(storage)));
|
||||
}
|
||||
|
||||
DoubleBuffer::DoubleBuffer(size_t capacity, NonnullOwnPtr<KBuffer> storage)
|
||||
: m_write_buffer(&m_buffer1)
|
||||
, m_read_buffer(&m_buffer2)
|
||||
, m_storage(move(storage))
|
||||
, m_capacity(capacity)
|
||||
{
|
||||
m_buffer1.data = m_storage->data();
|
||||
m_buffer1.size = 0;
|
||||
m_buffer2.data = m_storage->data() + capacity;
|
||||
m_buffer2.size = 0;
|
||||
m_space_for_writing = capacity;
|
||||
}
|
||||
|
||||
void DoubleBuffer::flip()
|
||||
{
|
||||
VERIFY(m_read_buffer_index == m_read_buffer->size);
|
||||
swap(m_read_buffer, m_write_buffer);
|
||||
m_write_buffer->size = 0;
|
||||
m_read_buffer_index = 0;
|
||||
compute_lockfree_metadata();
|
||||
}
|
||||
|
||||
ErrorOr<size_t> DoubleBuffer::write(UserOrKernelBuffer const& data, size_t size)
|
||||
{
|
||||
if (!size)
|
||||
return 0;
|
||||
MutexLocker locker(m_lock);
|
||||
size_t bytes_to_write = min(size, m_space_for_writing);
|
||||
u8* write_ptr = m_write_buffer->data + m_write_buffer->size;
|
||||
TRY(data.read(write_ptr, bytes_to_write));
|
||||
m_write_buffer->size += bytes_to_write;
|
||||
compute_lockfree_metadata();
|
||||
if (m_unblock_callback && !m_empty)
|
||||
m_unblock_callback();
|
||||
return bytes_to_write;
|
||||
}
|
||||
|
||||
ErrorOr<size_t> DoubleBuffer::read_impl(UserOrKernelBuffer& data, size_t size, MutexLocker&, bool advance_buffer_index)
|
||||
{
|
||||
if (size == 0)
|
||||
return 0;
|
||||
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);
|
||||
TRY(data.write(m_read_buffer->data + m_read_buffer_index, nread));
|
||||
if (advance_buffer_index)
|
||||
m_read_buffer_index += nread;
|
||||
compute_lockfree_metadata();
|
||||
if (m_unblock_callback && m_space_for_writing > 0)
|
||||
m_unblock_callback();
|
||||
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)
|
||||
{
|
||||
MutexLocker locker(m_lock);
|
||||
return read_impl(data, size, locker, false);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue