diff --git a/src/sna/sna.h b/src/sna/sna.h index 243f7958..f26c8271 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -1008,16 +1008,16 @@ void sna_image_composite(pixman_op_t op, uint16_t width, uint16_t height); -extern jmp_buf sigjmp; +extern jmp_buf sigjmp[4]; extern volatile sig_atomic_t sigtrap; #define sigtrap_assert() assert(sigtrap == 0) -#define sigtrap_get() sigsetjmp(sigjmp, ++sigtrap) +#define sigtrap_get() sigsetjmp(sigjmp[sigtrap++], 1) static inline void sigtrap_put(void) { + assert(sigtrap > 0); --sigtrap; - sigtrap_assert(); } #endif /* _SNA_H */ diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index f75bfe0d..7d45065b 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -396,15 +396,14 @@ static void assert_pixmap_damage(PixmapPtr p) #endif #endif -jmp_buf sigjmp; +jmp_buf sigjmp[4]; volatile sig_atomic_t sigtrap; static int sigtrap_handler(int sig) { if (sigtrap) { /* XXX rate-limited squawk? */ - sigtrap = 0; - siglongjmp(sigjmp, sig); + siglongjmp(sigjmp[--sigtrap], sig); } return -1;