summaryrefslogtreecommitdiffstats
path: root/platform/windows/display_server_windows.cpp
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2024-04-15 18:17:09 +0200
committerPedro J. Estébanez <pedrojrulez@gmail.com>2024-05-08 17:41:40 +0200
commitfc08eca5249b8c83debc99f246cbd54ede886717 (patch)
tree06b61c7411243b3f95a8e4285015ca244f27ab78 /platform/windows/display_server_windows.cpp
parent2042420bd7f43bb834316d7ca4631ab2fcfcc820 (diff)
downloadredot-engine-fc08eca5249b8c83debc99f246cbd54ede886717.tar.gz
DisplayServer: Avoid deadlocks while issuing input events and recursive main loop iterations
Diffstat (limited to 'platform/windows/display_server_windows.cpp')
-rw-r--r--platform/windows/display_server_windows.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index 94c368c504..e79d16629e 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -2962,30 +2962,28 @@ String DisplayServerWindows::keyboard_get_layout_name(int p_index) const {
}
void DisplayServerWindows::process_events() {
- _THREAD_SAFE_LOCK_
-
- MSG msg;
+ ERR_FAIL_COND(!Thread::is_main_thread());
if (!drop_events) {
joypad->process_joypads();
}
+ _THREAD_SAFE_LOCK_
+ MSG msg = {};
while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
+ _THREAD_SAFE_UNLOCK_
if (!drop_events) {
_process_key_events();
- _THREAD_SAFE_UNLOCK_
Input::get_singleton()->flush_buffered_events();
- } else {
- _THREAD_SAFE_UNLOCK_
}
}
void DisplayServerWindows::force_process_and_drop_events() {
- _THREAD_SAFE_METHOD_
+ ERR_FAIL_COND(!Thread::is_main_thread());
drop_events = true;
process_events();
@@ -4664,10 +4662,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
} break;
case WM_TIMER: {
if (wParam == windows[window_id].move_timer_id) {
+ _THREAD_SAFE_UNLOCK_
_process_key_events();
if (!Main::is_iterating()) {
Main::iteration();
}
+ _THREAD_SAFE_LOCK_
} else if (wParam == windows[window_id].activate_timer_id) {
_process_activate_event(window_id);
KillTimer(windows[window_id].hWnd, windows[window_id].activate_timer_id);