From 2e8eba7dd0a0d3c15f9ed58e7a3b5282e47fa8ca Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Mon, 21 Mar 2022 17:48:03 +0800 Subject: [PATCH] fix a deadlock bug: https://github.com/VincentWei/minigui/issues/83 --- src/include/dc.h | 2 +- src/kernel/desktop-comm.c | 4 ++-- src/kernel/desktop.c | 12 ++++++++---- src/newgdi/gdi.c | 2 -- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/include/dc.h b/src/include/dc.h index b636e93c..633213ea 100644 --- a/src/include/dc.h +++ b/src/include/dc.h @@ -93,7 +93,7 @@ typedef struct tagDC* PDC; # else /* not defined _MGSCHEMA_COMPOSITING */ void __mg_lock_recalc_gcrinfo (PDC pdc); void __mg_unlock_gcrinfo (PDC pdc); -#define LOCK_GCRINFO(pdc) __mg_lock_recalc_gcrinfo (pdc) +#define LOCK_GCRINFO(pdc) if (dc_IsGeneralDC(pdc)) __mg_lock_recalc_gcrinfo (pdc) #define UNLOCK_GCRINFO(pdc) if (dc_IsGeneralDC(pdc)) __mg_unlock_gcrinfo (pdc) # endif /* not defined _MGSCHEMA_COMPOSITING */ diff --git a/src/kernel/desktop-comm.c b/src/kernel/desktop-comm.c index d0c7e424..9e742d6e 100644 --- a/src/kernel/desktop-comm.c +++ b/src/kernel/desktop-comm.c @@ -1403,7 +1403,7 @@ static LRESULT WindowMessageHandler(UINT message, PMAINWIN pWin, LPARAM lParam) else { from = 0; } - + lock_zi_for_read (zi); from = __kernel_get_next_znode (zi, from); @@ -1821,7 +1821,7 @@ static void dskRefreshAllWindow (const RECT* invrc) info.is_empty_invrc = TRUE; #ifdef _MGHAVE_MENU - dskForceCloseMenu (); + dskForceCloseMenu (); #endif SendMessage (HWND_DESKTOP, MSG_ERASEDESKTOP, 0, diff --git a/src/kernel/desktop.c b/src/kernel/desktop.c index 0cb5d723..5ba1efc7 100644 --- a/src/kernel/desktop.c +++ b/src/kernel/desktop.c @@ -611,7 +611,11 @@ static inline void unlock_zi_for_change (const ZORDERINFO* zi) static inline void lock_zi_for_read (const ZORDERINFO* zi) { - pthread_rwlock_rdlock(&((ZORDERINFO*)zi)->rwlock); + if (pthread_rwlock_rdlock(&((ZORDERINFO*)zi)->rwlock)) { + _ERR_PRINTF("Failed pthread_rwlock_rdlock: %s (%d)\n", + strerror(errno), errno); + abort(); + } } static inline void unlock_zi_for_read (const ZORDERINFO* zi) @@ -3641,6 +3645,9 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) do_for_all_znodes (&rcOld, zi, _cb_update_znode, ZT_ALL); + /* unlock zi for change ... */ + unlock_zi_for_change (zi); + if (nodes [0].flags & ZOF_IF_REFERENCE) { SendMessage (HWND_DESKTOP, MSG_ERASEDESKTOP, 0, (LPARAM)&rcOld); @@ -3680,9 +3687,6 @@ static int dskMoveWindow (int cli, int idx_znode, HDC memdc, const RECT* rcWin) update_client_window_rgn (nodes [idx_znode].cli, nodes [idx_znode].hwnd); - - /* unlock zi for change ... */ - unlock_zi_for_change (zi); } else { lock_zi_for_change (zi); diff --git a/src/newgdi/gdi.c b/src/newgdi/gdi.c index 5e4c7055..684e2500 100644 --- a/src/newgdi/gdi.c +++ b/src/newgdi/gdi.c @@ -4349,8 +4349,6 @@ static void on_surface_changed_for_control (struct _travel_context* ctxt, RECT rc_surface, rc_minimal; PDC pdc = dc_HDC2PDC (ctrl->privCDC); - _WRN_PRINTF ("called\n"); - pdc->surface = ctxt->surface; if (pdc->surface != __gal_screen) {