sna: Allow limited recursion within sigtrapped routines
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 30 Oct 2013 18:48:10 +0000 (18:48 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 30 Oct 2013 18:52:14 +0000 (18:52 +0000)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/sna/sna.h
src/sna/sna_accel.c

index 243f795..f26c827 100644 (file)
@@ -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 */
index f75bfe0..7d45065 100644 (file)
@@ -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;