diff options
-rw-r--r-- | AK/Lock.h | 9 | ||||
-rw-r--r-- | Kernel/DoubleBuffer.h | 1 | ||||
-rw-r--r-- | Kernel/FileSystem.cpp | 3 | ||||
-rw-r--r-- | Kernel/IDEDiskDevice.cpp | 1 | ||||
-rw-r--r-- | Kernel/PTYMultiplexer.cpp | 1 | ||||
-rw-r--r-- | Kernel/ProcFS.cpp | 5 | ||||
-rw-r--r-- | Kernel/Process.cpp | 10 | ||||
-rw-r--r-- | Kernel/Process.h | 3 | ||||
-rw-r--r-- | Kernel/Scheduler.cpp | 24 | ||||
-rw-r--r-- | Kernel/Scheduler.h | 1 | ||||
-rw-r--r-- | Kernel/SyntheticFileSystem.cpp | 1 | ||||
-rw-r--r-- | Userland/top.cpp | 2 | ||||
-rw-r--r-- | WindowServer/WSMessageLoop.cpp | 1 | ||||
-rw-r--r-- | WindowServer/WSWindow.cpp | 3 | ||||
-rw-r--r-- | WindowServer/WSWindowManager.cpp | 1 |
15 files changed, 51 insertions, 15 deletions
@@ -27,16 +27,19 @@ static inline dword CAS(volatile dword* mem, dword newval, dword oldval) class Lock { public: - Lock() { } + Lock(const char* name = nullptr) : m_name(name) { } ~Lock() { } void lock(); void unlock(); + const char* name() const { return m_name; } + private: volatile dword m_lock { 0 }; dword m_level { 0 }; Process* m_holder { nullptr }; + const char* m_name { nullptr }; }; class Locker { @@ -65,7 +68,7 @@ inline void Lock::lock() } m_lock = 0; } - Scheduler::yield(); + Scheduler::donate_to(m_holder, m_name); } } @@ -86,7 +89,7 @@ inline void Lock::unlock() m_lock = 0; return; } - Scheduler::yield(); + Scheduler::donate_to(m_holder, m_name); } } diff --git a/Kernel/DoubleBuffer.h b/Kernel/DoubleBuffer.h index bc1efc0ac9..e7212a5f8a 100644 --- a/Kernel/DoubleBuffer.h +++ b/Kernel/DoubleBuffer.h @@ -9,6 +9,7 @@ public: DoubleBuffer() : m_write_buffer(&m_buffer1) , m_read_buffer(&m_buffer2) + , m_lock("DoubleBuffer") { } diff --git a/Kernel/FileSystem.cpp b/Kernel/FileSystem.cpp index 855ba34d9c..953ef55abe 100644 --- a/Kernel/FileSystem.cpp +++ b/Kernel/FileSystem.cpp @@ -85,7 +85,8 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, size_t nl, InodeIdentifier i, } Inode::Inode(FS& fs, unsigned index) - : m_fs(fs) + : m_lock("Inode") + , m_fs(fs) , m_index(index) { all_inodes().set(this); diff --git a/Kernel/IDEDiskDevice.cpp b/Kernel/IDEDiskDevice.cpp index 944ffbe91c..b036d78f73 100644 --- a/Kernel/IDEDiskDevice.cpp +++ b/Kernel/IDEDiskDevice.cpp @@ -39,6 +39,7 @@ RetainPtr<IDEDiskDevice> IDEDiskDevice::create() IDEDiskDevice::IDEDiskDevice() : IRQHandler(IRQ_FIXED_DISK) + , m_lock("IDEDiskDevice") { initialize(); } diff --git a/Kernel/PTYMultiplexer.cpp b/Kernel/PTYMultiplexer.cpp index 75e5a2e26e..ef3583a45f 100644 --- a/Kernel/PTYMultiplexer.cpp +++ b/Kernel/PTYMultiplexer.cpp @@ -14,6 +14,7 @@ PTYMultiplexer& PTYMultiplexer::the() PTYMultiplexer::PTYMultiplexer() : CharacterDevice(5, 2) + , m_lock("PTYMultiplexer") { s_the = this; m_freelist.ensure_capacity(s_max_pty_pairs); diff --git a/Kernel/ProcFS.cpp b/Kernel/ProcFS.cpp index e80b61a18d..117caaff6b 100644 --- a/Kernel/ProcFS.cpp +++ b/Kernel/ProcFS.cpp @@ -496,7 +496,7 @@ ByteBuffer procfs$all(InodeIdentifier) auto processes = Process::all_processes(); StringBuilder builder; auto build_process_line = [&builder] (Process* process) { - builder.appendf("%u,%u,%u,%u,%u,%u,%u,%s,%u,%u,%s,%s,%u,%u,%u,%u\n", + builder.appendf("%u,%u,%u,%u,%u,%u,%u,%s,%u,%u,%s,%s,%u,%u,%u,%u,%u\n", process->pid(), process->times_scheduled(), process->tty() ? process->tty()->pgid() : 0, @@ -512,7 +512,8 @@ ByteBuffer procfs$all(InodeIdentifier) process->amount_virtual(), process->amount_resident(), process->amount_shared(), - process->amount_in_bitmaps() + process->amount_in_bitmaps(), + process->ticks() ); }; build_process_line(Scheduler::colonel()); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 1fc1fb017e..f6fae8c9d5 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -2192,3 +2192,13 @@ void Process::finalize_dying_processes() for (auto* process : dying_processes) process->finalize(); } + +bool Process::tick() +{ + ++m_ticks; + if (tss().cs & 3) + ++m_ticks_in_user; + else + ++m_ticks_in_kernel; + return --m_ticks_left; +} diff --git a/Kernel/Process.h b/Kernel/Process.h index 41339740c8..2b0806626c 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -131,8 +131,9 @@ public: template<typename Callback> static void for_each_living(Callback); template<typename Callback> void for_each_child(Callback); - bool tick() { ++m_ticks; return --m_ticks_left; } + bool tick(); void set_ticks_left(dword t) { m_ticks_left = t; } + dword ticks_left() const { return m_ticks_left; } void set_selector(word s) { m_far_ptr.selector = s; } void set_state(State s) { m_state = s; } diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index 66f36902fe..a3e2d6b8d1 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -192,6 +192,24 @@ bool Scheduler::pick_next() } } +bool Scheduler::donate_to(Process* beneficiary, const char* reason) +{ + (void)reason; + unsigned ticks_left = current->ticks_left(); + if (!beneficiary || beneficiary->state() != Process::Runnable || ticks_left <= 1) { + return yield(); + } + + unsigned ticks_to_donate = ticks_left - 1; +#ifdef SCHEDULER_DEBUG + dbgprintf("%s(%u) donating %u ticks to %s(%u), reason=%s\n", current->name().characters(), current->pid(), ticks_to_donate, beneficiary->name().characters(), beneficiary->pid(), reason); +#endif + context_switch(*beneficiary); + beneficiary->set_ticks_left(ticks_to_donate); + switch_now(); + return 0; +} + bool Scheduler::yield() { InterruptDisabler disabler; @@ -229,12 +247,6 @@ bool Scheduler::context_switch(Process& process) process.set_ticks_left(time_slice); process.did_schedule(); - if (process.tss().cs & 3) { - ++process.m_ticks_in_user; - } else { - ++process.m_ticks_in_kernel; - } - if (current == &process) return false; diff --git a/Kernel/Scheduler.h b/Kernel/Scheduler.h index b6db08dddb..918b553b3a 100644 --- a/Kernel/Scheduler.h +++ b/Kernel/Scheduler.h @@ -17,6 +17,7 @@ public: static void pick_next_and_switch_now(); static void switch_now(); static bool yield(); + static bool donate_to(Process*, const char* reason); static bool context_switch(Process&); static void prepare_to_modify_tss(Process&); static Process* colonel(); diff --git a/Kernel/SyntheticFileSystem.cpp b/Kernel/SyntheticFileSystem.cpp index 221168ee52..a94fcab773 100644 --- a/Kernel/SyntheticFileSystem.cpp +++ b/Kernel/SyntheticFileSystem.cpp @@ -11,6 +11,7 @@ RetainPtr<SynthFS> SynthFS::create() } SynthFS::SynthFS() + : m_lock("SynthFS") { } diff --git a/Userland/top.cpp b/Userland/top.cpp index 2e0d20bfa7..cc5c79e9c4 100644 --- a/Userland/top.cpp +++ b/Userland/top.cpp @@ -43,7 +43,7 @@ static Snapshot get_snapshot() if (!ptr) break; auto parts = String(buf, Chomp).split(','); - if (parts.size() < 16) + if (parts.size() < 17) break; bool ok; pid_t pid = parts[0].to_uint(ok); diff --git a/WindowServer/WSMessageLoop.cpp b/WindowServer/WSMessageLoop.cpp index 224595a7e1..7ab5781e86 100644 --- a/WindowServer/WSMessageLoop.cpp +++ b/WindowServer/WSMessageLoop.cpp @@ -13,6 +13,7 @@ static WSMessageLoop* s_the; WSMessageLoop::WSMessageLoop() + : m_lock("WSMessageLoop") { if (!s_the) s_the = this; diff --git a/WindowServer/WSWindow.cpp b/WindowServer/WSWindow.cpp index e98a7ed368..d651c916f7 100644 --- a/WindowServer/WSWindow.cpp +++ b/WindowServer/WSWindow.cpp @@ -5,7 +5,8 @@ #include "Process.h" WSWindow::WSWindow(Process& process, int window_id) - : m_process(&process) + : m_lock("WSWindow") + , m_process(&process) , m_window_id(window_id) , m_pid(process.pid()) { diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 0999ccde73..efc2c427f7 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -130,6 +130,7 @@ void WSWindowManager::flip_buffers() WSWindowManager::WSWindowManager() : m_screen(WSScreen::the()) , m_screen_rect(m_screen.rect()) + , m_lock("WSWindowManager") { #ifndef DEBUG_COUNTERS (void)m_compose_count; |