diff --git a/Kernel/ProcessGUI.cpp b/Kernel/ProcessGUI.cpp index 445fd2e913..dce8974ecf 100644 --- a/Kernel/ProcessGUI.cpp +++ b/Kernel/ProcessGUI.cpp @@ -264,6 +264,7 @@ void Process::destroy_all_windows() { for (auto& it : m_windows) { auto message = make(WSMessage::WM_DestroyWindow); + it.value->notify_process_died(Badge()); WSMessageLoop::the().post_message(it.value.leak_ptr(), move(message), true); } m_windows.clear(); diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index c81ff99256..377455c569 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -236,7 +236,10 @@ bool Scheduler::context_switch(Process& process) current->set_state(Process::Runnable); #ifdef LOG_EVERY_CONTEXT_SWITCH - dbgprintf("Scheduler: %s(%u) -> %s(%u)\n", current->name().characters(), current->pid(), process.name().characters(), process.pid()); + dbgprintf("Scheduler: %s(%u) -> %s(%u) %w:%x\n", + current->name().characters(), current->pid(), + process.name().characters(), process.pid(), + process.tss().cs, process.tss().eip); #endif } diff --git a/WindowServer/WSWindow.cpp b/WindowServer/WSWindow.cpp index dfaebea425..8b6414c8ec 100644 --- a/WindowServer/WSWindow.cpp +++ b/WindowServer/WSWindow.cpp @@ -5,7 +5,7 @@ #include "Process.h" WSWindow::WSWindow(Process& process, int window_id) - : m_process(process) + : m_process(&process) , m_window_id(window_id) , m_pid(process.pid()) { @@ -34,11 +34,13 @@ void WSWindow::set_rect(const Rect& rect) Rect old_rect; { WSWindowLocker locker(*this); + if (!m_process) + return; if (m_rect == rect) return; old_rect = m_rect; m_rect = rect; - m_backing = GraphicsBitmap::create(m_process, m_rect.size()); + m_backing = GraphicsBitmap::create(*m_process, m_rect.size()); } WSWindowManager::the().notify_rect_changed(*this, old_rect, rect); } @@ -124,11 +126,20 @@ void WSWindow::on_message(WSMessage& message) return; { - LOCKER(m_process.gui_events_lock()); - m_process.gui_events().append(move(gui_event)); + WSWindowLocker window_locker(*this); + if (!m_process) + return; + LOCKER(m_process->gui_events_lock()); + m_process->gui_events().append(move(gui_event)); } } +void WSWindow::notify_process_died(Badge) +{ + WSWindowLocker locker(*this); + m_process = nullptr; +} + void WSWindow::set_global_cursor_tracking_enabled(bool enabled) { dbgprintf("WSWindow{%p} global_cursor_tracking <- %u\n", enabled); diff --git a/WindowServer/WSWindow.h b/WindowServer/WSWindow.h index 12a30da4b7..d09cf18d9c 100644 --- a/WindowServer/WSWindow.h +++ b/WindowServer/WSWindow.h @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include "WSMessageReceiver.h" class Process; @@ -45,6 +47,8 @@ public: void set_global_cursor_tracking_enabled(bool); bool global_cursor_tracking() const { return m_global_cursor_tracking_enabled; } + void notify_process_died(Badge); + // For InlineLinkedList. // FIXME: Maybe make a ListHashSet and then WSWindowManager can just use that. WSWindow* m_next { nullptr }; @@ -58,7 +62,7 @@ private: bool m_global_cursor_tracking_enabled { false }; RetainPtr m_backing; - Process& m_process; + Process* m_process { nullptr }; int m_window_id { -1 }; pid_t m_pid { -1 }; };