From 9e179e66f2af41f9ea5794acef6210ffb486a22b Mon Sep 17 00:00:00 2001 From: Nick Briggs Date: Thu, 8 Jul 2021 15:18:41 -0700 Subject: [PATCH] Call getXsignaldata() with XLocked set getXsignaldata() can call additional Xlib procedures which could generate an I/O interrupt. To avoid deadlocks in Xlib, ensure that XLocked is set when getXsignaldata() is called. --- inc/ldeXdefs.h | 13 +++++++------ inc/xdefs.h | 9 +++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/inc/ldeXdefs.h b/inc/ldeXdefs.h index 9a702cd..8b145e4 100755 --- a/inc/ldeXdefs.h +++ b/inc/ldeXdefs.h @@ -13,15 +13,16 @@ /************************************************************************/ #ifdef LOCK_X_UPDATES -#define XLOCK { XLocked++; /* printf("L"); fflush(stdout);*/} -#define XUNLOCK(dsp) \ - { XLocked--;/* printf("U"); fflush(stdout);*/ \ - if (XNeedSignal) \ +#define XLOCK do { XLocked++; } while (0) +#define XUNLOCK(dsp) \ + do { \ + if (XLocked == 1 && XNeedSignal) \ { \ XNeedSignal = 0; \ getXsignaldata(dsp); \ - }; \ - } + }; \ + XLocked--; \ + } while (0) #else #define XLOCK #define XUNLOCK diff --git a/inc/xdefs.h b/inc/xdefs.h index 1ebb96e..d87ae6e 100755 --- a/inc/xdefs.h +++ b/inc/xdefs.h @@ -38,14 +38,15 @@ extern volatile sig_atomic_t XLocked; extern volatile sig_atomic_t XNeedSignal; -#define XLOCK do { XLocked++; /* printf("L"); fflush(stdout);*/} while (0) -#define XUNLOCK(dsp) \ - do { XLocked--;/* printf("U"); fflush(stdout);*/ \ - if (XNeedSignal) \ +#define XLOCK do { XLocked++; } while (0) +#define XUNLOCK(dsp) \ + do { \ + if (XLocked == 1 && XNeedSignal) \ { \ XNeedSignal = 0; \ getXsignaldata(dsp); \ }; \ + XLocked--; \ } while (0) #else #define XLOCK