1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-03-03 10:05:22 +00:00

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.
This commit is contained in:
Nick Briggs
2021-07-08 15:18:41 -07:00
parent 084d69c6e8
commit 9e179e66f2
2 changed files with 12 additions and 10 deletions

View File

@@ -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

View File

@@ -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