mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:17:35 +00:00
Kernel: Use a CircularQueue for input rather than a DoubleBuffer
TTY::emit is called from an IRQ handler, and is used to push input data into a buffer for later retrieval. Previously this was using DoubleBuffer, but that class wants to take a lock. Our lock code wants to make sure interrupts are enabled, but they're disabled while an IRQ handler is running. This made the kernel sad, but this CircularQueue cheers it up by avoiding the lock requirement completely.
This commit is contained in:
parent
ce8387d1ed
commit
4b44962e03
2 changed files with 11 additions and 4 deletions
|
@ -26,7 +26,13 @@ void TTY::set_default_termios()
|
|||
|
||||
ssize_t TTY::read(FileDescription&, u8* buffer, ssize_t size)
|
||||
{
|
||||
return m_buffer.read(buffer, size);
|
||||
if (m_input_buffer.size() < size)
|
||||
size = m_input_buffer.size();
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
buffer[i] = m_input_buffer.dequeue();
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
ssize_t TTY::write(FileDescription&, const u8* buffer, ssize_t size)
|
||||
|
@ -44,7 +50,7 @@ ssize_t TTY::write(FileDescription&, const u8* buffer, ssize_t size)
|
|||
|
||||
bool TTY::can_read(FileDescription&) const
|
||||
{
|
||||
return !m_buffer.is_empty();
|
||||
return !m_input_buffer.is_empty();
|
||||
}
|
||||
|
||||
bool TTY::can_write(FileDescription&) const
|
||||
|
@ -71,7 +77,7 @@ void TTY::emit(u8 ch)
|
|||
return;
|
||||
}
|
||||
}
|
||||
m_buffer.write(&ch, 1);
|
||||
m_input_buffer.enqueue(ch);
|
||||
}
|
||||
|
||||
void TTY::generate_signal(int signal)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue