diff --git a/src/include/zorder.h b/src/include/zorder.h index 33f3c7f4..e9d12424 100644 --- a/src/include/zorder.h +++ b/src/include/zorder.h @@ -147,6 +147,7 @@ typedef struct _ZORDERINFO { # else pthread_mutex_t rwlock; # endif + pthread_t wrlock_owner; #elif defined(_MGRM_PROCESSES) int zi_semid; int zi_semnum; diff --git a/src/kernel/desktop.c b/src/kernel/desktop.c index 0454dbf9..da68ff24 100644 --- a/src/kernel/desktop.c +++ b/src/kernel/desktop.c @@ -602,20 +602,30 @@ static void reset_window (PMAINWIN pWin, RECT* rcWin) static inline void lock_zi_for_change (const ZORDERINFO* zi) { pthread_rwlock_wrlock(&((ZORDERINFO*)zi)->rwlock); + ((ZORDERINFO*)zi)->wrlock_owner = pthread_self(); } static inline void unlock_zi_for_change (const ZORDERINFO* zi) { pthread_rwlock_unlock(&((ZORDERINFO*)zi)->rwlock); + ((ZORDERINFO*)zi)->wrlock_owner = 0; } static inline void lock_zi_for_read (const ZORDERINFO* zi) { + if (zi->wrlock_owner == pthread_self()) { + return; + } + pthread_rwlock_rdlock(&((ZORDERINFO*)zi)->rwlock); } static inline void unlock_zi_for_read (const ZORDERINFO* zi) { + if (zi->wrlock_owner == pthread_self()) { + return; + } + pthread_rwlock_unlock(&((ZORDERINFO*)zi)->rwlock); } #else /* __NOUNIX__ */