mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 03:37:43 +00:00
Kernel/x86: Move Processor::{leave,clear}_critical() out of line
I don't think this code needs to be ALWAYS_INLINE, and moving it out of line will make backtraces nicer.
This commit is contained in:
parent
28e552f853
commit
cd348918f9
2 changed files with 34 additions and 29 deletions
|
@ -349,37 +349,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ALWAYS_INLINE void do_leave_critical()
|
void do_leave_critical();
|
||||||
{
|
|
||||||
VERIFY(m_in_critical > 0);
|
|
||||||
if (m_in_critical == 1) {
|
|
||||||
if (m_in_irq == 0) {
|
|
||||||
deferred_call_execute_pending();
|
|
||||||
VERIFY(m_in_critical == 1);
|
|
||||||
}
|
|
||||||
m_in_critical = 0;
|
|
||||||
if (m_in_irq == 0)
|
|
||||||
check_invoke_scheduler();
|
|
||||||
} else {
|
|
||||||
m_in_critical = m_in_critical - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ALWAYS_INLINE static void leave_critical()
|
static void leave_critical();
|
||||||
{
|
static u32 clear_critical();
|
||||||
current().do_leave_critical();
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE static u32 clear_critical()
|
|
||||||
{
|
|
||||||
auto prev_critical = in_critical();
|
|
||||||
write_gs_ptr(__builtin_offsetof(Processor, m_in_critical), 0);
|
|
||||||
auto& proc = current();
|
|
||||||
if (proc.m_in_irq == 0)
|
|
||||||
proc.check_invoke_scheduler();
|
|
||||||
return prev_critical;
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE static void restore_critical(u32 prev_critical)
|
ALWAYS_INLINE static void restore_critical(u32 prev_critical)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1665,4 +1665,35 @@ u64 Processor::time_spent_idle() const
|
||||||
return m_idle_thread->time_in_user() + m_idle_thread->time_in_kernel();
|
return m_idle_thread->time_in_user() + m_idle_thread->time_in_kernel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Processor::leave_critical()
|
||||||
|
{
|
||||||
|
current().do_leave_critical();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Processor::do_leave_critical()
|
||||||
|
{
|
||||||
|
VERIFY(m_in_critical > 0);
|
||||||
|
if (m_in_critical == 1) {
|
||||||
|
if (m_in_irq == 0) {
|
||||||
|
deferred_call_execute_pending();
|
||||||
|
VERIFY(m_in_critical == 1);
|
||||||
|
}
|
||||||
|
m_in_critical = 0;
|
||||||
|
if (m_in_irq == 0)
|
||||||
|
check_invoke_scheduler();
|
||||||
|
} else {
|
||||||
|
m_in_critical = m_in_critical - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 Processor::clear_critical()
|
||||||
|
{
|
||||||
|
auto prev_critical = in_critical();
|
||||||
|
write_gs_ptr(__builtin_offsetof(Processor, m_in_critical), 0);
|
||||||
|
auto& proc = current();
|
||||||
|
if (proc.m_in_irq == 0)
|
||||||
|
proc.check_invoke_scheduler();
|
||||||
|
return prev_critical;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue