lib/drmtest: don't complete fixtures with a longjmp

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>
This commit is contained in:
Daniel Vetter 2013-08-26 20:52:14 +02:00
parent cf93ba45b0
commit 8869e1e628
2 changed files with 11 additions and 2 deletions

View File

@ -666,6 +666,11 @@ bool __igt_fixture(void)
return true; return true;
} }
void __igt_fixture_complete(void)
{
in_fixture = false;
}
void __igt_fixture_end(void) void __igt_fixture_end(void)
{ {
assert(in_fixture); assert(in_fixture);

View 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) #define igt_require(expr) do { if (!(expr)) __igt_skip_check(__FILE__, __LINE__, __func__, #expr ); } while (0)
bool __igt_fixture(void); bool __igt_fixture(void);
void __igt_fixture_complete(void);
void __igt_fixture_end(void) __attribute__((noreturn)); void __igt_fixture_end(void) __attribute__((noreturn));
/** /**
* igt_fixture - annote global test fixture code * 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 * enumeration (e.g. when enumerating on systemes without an intel gpu) such
* blocks should be annotated with igt_fixture. * 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); \ (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() */ /* check functions which auto-skip tests by calling igt_skip() */
void gem_require_caching(int fd); void gem_require_caching(int fd);