mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 12:58:12 +00:00
Kernel: Various context switch fixes
These changes solve a number of problems with the software context swithcing: * The scheduler lock really should be held throughout context switches * Transitioning from the initial (idle) thread to another needs to hold the scheduler lock * Transitioning from a dying thread to another also needs to hold the scheduler lock * Dying threads cannot necessarily be finalized if they haven't switched out of it yet, so flag them as active while a processor is running it (the Running state may be switched to Dying while it still is actually running)
This commit is contained in:
parent
49f5069b76
commit
2a82a25fec
9 changed files with 235 additions and 89 deletions
|
@ -438,6 +438,18 @@ public:
|
|||
return m_wait_reason;
|
||||
}
|
||||
|
||||
void set_active(bool active)
|
||||
{
|
||||
ASSERT(g_scheduler_lock.is_locked());
|
||||
m_is_active = active;
|
||||
}
|
||||
|
||||
bool is_finalizable() const
|
||||
{
|
||||
ASSERT(g_scheduler_lock.is_locked());
|
||||
return !m_is_active;
|
||||
}
|
||||
|
||||
Thread* clone(Process&);
|
||||
|
||||
template<typename Callback>
|
||||
|
@ -467,8 +479,8 @@ private:
|
|||
private:
|
||||
friend class SchedulerData;
|
||||
friend class WaitQueue;
|
||||
bool unlock_process_if_locked(u32& prev_crit);
|
||||
void relock_process(bool did_unlock, u32 prev_crit);
|
||||
bool unlock_process_if_locked();
|
||||
void relock_process(bool did_unlock);
|
||||
String backtrace_impl();
|
||||
void reset_fpu_state();
|
||||
|
||||
|
@ -491,6 +503,7 @@ private:
|
|||
Blocker* m_blocker { nullptr };
|
||||
const char* m_wait_reason { nullptr };
|
||||
|
||||
bool m_is_active { false };
|
||||
bool m_is_joinable { true };
|
||||
Thread* m_joiner { nullptr };
|
||||
Thread* m_joinee { nullptr };
|
||||
|
@ -526,7 +539,6 @@ private:
|
|||
|
||||
OwnPtr<ThreadTracer> m_tracer;
|
||||
|
||||
void notify_finalizer();
|
||||
void yield_without_holding_big_lock();
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue