lib/drmtest: don't complete fixtures with a longjmp
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 26 Aug 2013 18:52:14 +0000 (20:52 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 26 Aug 2013 18:55:54 +0000 (20:55 +0200)
Longjmp creates havoc with stack variables of the current stackframe.
And since fixtures should be used to set up such variables creating
havoc isn't a great idea. With this I can revert a bunch of
bogus patches I've done to paper over this by moving stack variables
to be global.

The same issue is actually a feature for subtest blocks since subtests
should be independant anyway.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
lib/drmtest.c
lib/drmtest.h

index 37d7da3..6247ef5 100644 (file)
@@ -666,6 +666,11 @@ bool __igt_fixture(void)
        return true;
 }
 
+void __igt_fixture_complete(void)
+{
+       in_fixture = false;
+}
+
 void __igt_fixture_end(void)
 {
        assert(in_fixture);
index 1cada0c..5fecb2b 100644 (file)
@@ -184,6 +184,7 @@ void igt_exit(void) __attribute__((noreturn));
 #define igt_require(expr) do { if (!(expr)) __igt_skip_check(__FILE__, __LINE__, __func__, #expr ); } while (0)
 
 bool __igt_fixture(void);
+void __igt_fixture_complete(void);
 void __igt_fixture_end(void) __attribute__((noreturn));
 /**
  * igt_fixture - annote global test fixture code
@@ -193,9 +194,12 @@ void __igt_fixture_end(void) __attribute__((noreturn));
  * enumeration (e.g. when enumerating on systemes without an intel gpu) such
  * blocks should be annotated with igt_fixture.
  */
-#define igt_fixture for (; __igt_fixture() && \
+#define igt_fixture for (int igt_tokencat(__tmpint,__LINE__) = 0; \
+                        igt_tokencat(__tmpint,__LINE__) < 1 && \
+                        __igt_fixture() && \
                         (setjmp(igt_subtest_jmpbuf) == 0); \
-                        __igt_fixture_end())
+                        igt_tokencat(__tmpint,__LINE__) ++, \
+                        __igt_fixture_complete())
 
 /* check functions which auto-skip tests by calling igt_skip() */
 void gem_require_caching(int fd);