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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user