Kernel: Rewrite all kernel mutexes
Now SpinLock is actually just a spin lock and I added a Mutex that does the same as the old "SpinLock". This is in preparation for starting to support smp and making the kernel smp safe. This commit also removes obsolete PageTableScope and CriticalScope which should now be used by alternative APIs.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#include <BAN/HashMap.h>
|
||||
#include <kernel/CriticalScope.h>
|
||||
#include <kernel/FS/VirtualFileSystem.h>
|
||||
#include <kernel/Input/KeyboardLayout.h>
|
||||
#include <kernel/Lock/LockGuard.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
@@ -74,6 +74,7 @@ namespace Kernel::Input
|
||||
|
||||
Key KeyboardLayout::get_key_from_event(KeyEvent event)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
if (event.shift())
|
||||
return m_keycode_to_key_shift[event.keycode];
|
||||
if (event.ralt())
|
||||
@@ -256,7 +257,7 @@ namespace Kernel::Input
|
||||
}
|
||||
}
|
||||
|
||||
CriticalScope _;
|
||||
LockGuard _(m_lock);
|
||||
|
||||
for (size_t i = 0; i < new_layout->m_keycode_to_key_normal.size(); i++)
|
||||
if (new_layout->m_keycode_to_key_normal[i] != Key::None)
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Kernel::Input
|
||||
BAN::ErrorOr<void> PS2Controller::send_byte(uint16_t port, uint8_t byte)
|
||||
{
|
||||
ASSERT(interrupts_enabled());
|
||||
LockGuard _(m_lock);
|
||||
LockGuard _(m_mutex);
|
||||
uint64_t timeout = SystemTimer::get().ms_since_boot() + s_ps2_timeout_ms;
|
||||
while (SystemTimer::get().ms_since_boot() < timeout)
|
||||
{
|
||||
@@ -37,7 +37,7 @@ namespace Kernel::Input
|
||||
BAN::ErrorOr<uint8_t> PS2Controller::read_byte()
|
||||
{
|
||||
ASSERT(interrupts_enabled());
|
||||
LockGuard _(m_lock);
|
||||
LockGuard _(m_mutex);
|
||||
uint64_t timeout = SystemTimer::get().ms_since_boot() + s_ps2_timeout_ms;
|
||||
while (SystemTimer::get().ms_since_boot() < timeout)
|
||||
{
|
||||
@@ -50,14 +50,14 @@ namespace Kernel::Input
|
||||
|
||||
BAN::ErrorOr<void> PS2Controller::send_command(PS2::Command command)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
LockGuard _(m_mutex);
|
||||
TRY(send_byte(PS2::IOPort::COMMAND, command));
|
||||
return {};
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> PS2Controller::send_command(PS2::Command command, uint8_t data)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
LockGuard _(m_mutex);
|
||||
TRY(send_byte(PS2::IOPort::COMMAND, command));
|
||||
TRY(send_byte(PS2::IOPort::DATA, data));
|
||||
return {};
|
||||
@@ -65,7 +65,7 @@ namespace Kernel::Input
|
||||
|
||||
BAN::ErrorOr<void> PS2Controller::device_send_byte(uint8_t device_index, uint8_t byte)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
LockGuard _(m_mutex);
|
||||
if (device_index == 1)
|
||||
TRY(send_byte(PS2::IOPort::COMMAND, PS2::Command::WRITE_TO_SECOND_PORT));
|
||||
TRY(send_byte(PS2::IOPort::DATA, byte));
|
||||
@@ -74,7 +74,7 @@ namespace Kernel::Input
|
||||
|
||||
BAN::ErrorOr<void> PS2Controller::device_send_byte_and_wait_ack(uint8_t device_index, uint8_t byte)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
LockGuard _(m_mutex);
|
||||
for (;;)
|
||||
{
|
||||
TRY(device_send_byte(device_index, byte));
|
||||
@@ -101,8 +101,7 @@ namespace Kernel::Input
|
||||
|
||||
bool PS2Controller::append_command_queue(PS2Device* device, uint8_t command, uint8_t response_size)
|
||||
{
|
||||
// NOTE: command queue push/pop must be done without interrupts
|
||||
CriticalScope _;
|
||||
LockGuard _(m_cmd_lock);
|
||||
if (m_command_queue.size() + 1 >= m_command_queue.capacity())
|
||||
{
|
||||
dprintln("PS/2 command queue full");
|
||||
@@ -121,8 +120,7 @@ namespace Kernel::Input
|
||||
|
||||
bool PS2Controller::append_command_queue(PS2Device* device, uint8_t command, uint8_t data, uint8_t response_size)
|
||||
{
|
||||
// NOTE: command queue push/pop must be done without interrupts
|
||||
CriticalScope _;
|
||||
LockGuard _(m_cmd_lock);
|
||||
if (m_command_queue.size() + 1 >= m_command_queue.capacity())
|
||||
{
|
||||
dprintln("PS/2 command queue full");
|
||||
@@ -143,6 +141,9 @@ namespace Kernel::Input
|
||||
{
|
||||
ASSERT(interrupts_enabled());
|
||||
|
||||
// NOTE: CircularQueue reads don't need locking, as long as
|
||||
// we can guarantee that read element is not popped
|
||||
|
||||
if (m_command_queue.empty())
|
||||
return;
|
||||
auto& command = m_command_queue.front();
|
||||
@@ -152,6 +153,8 @@ namespace Kernel::Input
|
||||
{
|
||||
dwarnln_if(DEBUG_PS2, "Command timedout");
|
||||
m_devices[command.device_index]->command_timedout(command.out_data, command.out_count);
|
||||
|
||||
LockGuard _(m_cmd_lock);
|
||||
m_command_queue.pop();
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include <BAN/ScopeGuard.h>
|
||||
#include <kernel/CriticalScope.h>
|
||||
#include <kernel/FS/DevFS/FileSystem.h>
|
||||
#include <kernel/Input/KeyboardLayout.h>
|
||||
#include <kernel/Input/PS2/Config.h>
|
||||
@@ -165,6 +164,7 @@ namespace Kernel::Input
|
||||
event.modifier = m_modifiers | (released ? 0 : KeyEvent::Modifier::Pressed);
|
||||
event.keycode = keycode.value();
|
||||
|
||||
LockGuard _(m_event_lock);
|
||||
if (m_event_queue.full())
|
||||
{
|
||||
dwarnln("PS/2 event queue full");
|
||||
@@ -197,7 +197,7 @@ namespace Kernel::Input
|
||||
if (m_event_queue.empty())
|
||||
TRY(Thread::current().block_or_eintr_indefinite(m_semaphore));
|
||||
|
||||
CriticalScope _;
|
||||
LockGuard _(m_event_lock);
|
||||
if (m_event_queue.empty())
|
||||
continue;
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include <BAN/ScopeGuard.h>
|
||||
#include <kernel/CriticalScope.h>
|
||||
#include <kernel/FS/DevFS/FileSystem.h>
|
||||
#include <kernel/Input/PS2/Config.h>
|
||||
#include <kernel/Input/PS2/Mouse.h>
|
||||
@@ -158,6 +157,7 @@ namespace Kernel::Input
|
||||
event.scroll_event.scroll = rel_z;
|
||||
}
|
||||
|
||||
LockGuard _(m_event_lock);
|
||||
for (int i = 0; i < event_count; i++)
|
||||
{
|
||||
if (m_event_queue.full())
|
||||
@@ -181,7 +181,7 @@ namespace Kernel::Input
|
||||
if (m_event_queue.empty())
|
||||
TRY(Thread::current().block_or_eintr_indefinite(m_semaphore));
|
||||
|
||||
CriticalScope _;
|
||||
LockGuard _(m_event_lock);
|
||||
if (m_event_queue.empty())
|
||||
continue;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user