[igt-dev] [PATCH i-g-t 1/2] lib: Refactor construction of unique tokens

Ashutosh Dixit ashutosh.dixit at intel.com
Tue Oct 5 22:29:34 UTC 2021


From: Chris Wilson <chris.p.wilson at intel.com>

Wrap all the igt_tokencat(prefix, __LINE) into its own igt_unique() to
reduce the clutter and make it easier to generate unique tokens for other
common macros.

Signed-off-by: Chris Wilson <chris.p.wilson at intel.com>
---
 lib/igt_core.h | 54 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/lib/igt_core.h b/lib/igt_core.h
index 8d433fc1655..6b8dbf348d8 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -147,12 +147,12 @@ __noreturn void __igt_fixture_end(void);
  * enumeration (e.g. when enumerating on systems without an intel gpu) such
  * blocks should be annotated with igt_fixture.
  */
-#define igt_fixture for (volatile int igt_tokencat(__tmpint,__LINE__) = 0; \
-			 igt_tokencat(__tmpint,__LINE__) < 1 && \
+#define igt_fixture for (volatile int igt_unique(__tmpint) = 0; \
+			 igt_unique(__tmpint) < 1 && \
 			 (STATIC_ANALYSIS_BUILD || \
 			 (__igt_fixture() && \
 			 (sigsetjmp(igt_subtest_jmpbuf, 1) == 0))); \
-			 igt_tokencat(__tmpint,__LINE__) ++, \
+			 igt_unique(__tmpint) ++, \
 			 __igt_fixture_complete())
 
 /* subtest infrastructure */
@@ -203,6 +203,16 @@ bool __igt_run_dynamic_subtest(const char *dynamic_subtest_name);
  */
 #define igt_tokencat(x, y) __igt_tokencat2(x, y)
 
+/**
+ * igt_unique:
+ * @prefix: local identifier
+ *
+ * C preprocessor helper to generate a custom 'unique' token by appending
+ * the line number onto the token.
+ */
+#define igt_unique(prefix) \
+	igt_tokencat(igt_tokencat(__igt_unique__, prefix), __LINE__)
+
 /**
  * igt_subtest:
  * @name: name of the subtest
@@ -238,7 +248,7 @@ bool __igt_run_dynamic_subtest(const char *dynamic_subtest_name);
  * static string.
  */
 #define igt_subtest_f(f...) \
-	__igt_subtest_f(igt_tokencat(__tmpchar, __LINE__), f)
+	__igt_subtest_f(igt_unique(__tmpchar), f)
 
 /**
  * igt_subtest_with_dynamic:
@@ -315,7 +325,7 @@ bool __igt_run_dynamic_subtest(const char *dynamic_subtest_name);
  * format string instead of a static string.
  */
 #define igt_subtest_with_dynamic_f(f...) \
-	__igt_subtest_with_dynamic_f(igt_tokencat(__tmpchar, __LINE__), f)
+	__igt_subtest_with_dynamic_f(igt_unique(__tmpchar), f)
 
 /**
  * igt_dynamic:
@@ -358,7 +368,7 @@ bool __igt_run_dynamic_subtest(const char *dynamic_subtest_name);
  * instead of a static string.
  */
 #define igt_dynamic_f(f...) \
-	__igt_dynamic_f(igt_tokencat(__tmpchar, __LINE__), f)
+	__igt_dynamic_f(igt_unique(__tmpchar), f)
 
 const char *igt_subtest_name(void);
 bool igt_only_list_subtests(void);
@@ -380,15 +390,15 @@ void __igt_subtest_group_restore(int, int);
  * clauses. If any common setup in a fixture fails, only the subtests in this
  * group will fail or skip. Subtest groups can be arbitrarily nested.
  */
-#define igt_subtest_group for (int igt_tokencat(__tmpint,__LINE__) = 0, \
-			       igt_tokencat(__save,__LINE__) = 0, \
-			       igt_tokencat(__desc,__LINE__) = 0; \
-			       igt_tokencat(__tmpint,__LINE__) < 1 && \
-			       (__igt_subtest_group_save(& igt_tokencat(__save,__LINE__), \
-							 & igt_tokencat(__desc,__LINE__) ), true); \
-			       igt_tokencat(__tmpint,__LINE__) ++, \
-			       __igt_subtest_group_restore(igt_tokencat(__save,__LINE__), \
-							   igt_tokencat(__desc,__LINE__)))
+#define igt_subtest_group for (int igt_unique(__tmpint) = 0, \
+			       igt_unique(__save) = 0, \
+			       igt_unique(__desc) = 0; \
+			       igt_unique(__tmpint) < 1 && \
+			       (__igt_subtest_group_save(& igt_unique(__save), \
+							 & igt_unique(__desc) ), true); \
+			       igt_unique(__tmpint) ++, \
+			       __igt_subtest_group_restore(igt_unique(__save), \
+							   igt_unique(__desc)))
 
 /**
  * igt_main_args:
@@ -404,15 +414,15 @@ void __igt_subtest_group_restore(int, int);
  * #igt_subtest_init_parse_opts.
  */
 #define igt_main_args(short_opts, long_opts, help_str, opt_handler, handler_data) \
-	static void igt_tokencat(__real_main, __LINE__)(void); \
+	static void igt_unique(__real_main)(void); \
 	int main(int argc, char **argv) { \
 		igt_subtest_init_parse_opts(&argc, argv, \
 					    short_opts, long_opts, help_str, \
 					    opt_handler, handler_data); \
-		igt_tokencat(__real_main, __LINE__)(); \
+		igt_unique(__real_main)(); \
 		igt_exit(); \
 	} \
-	static void igt_tokencat(__real_main, __LINE__)(void) \
+	static void igt_unique(__real_main)(void) \
 
 
 /**
@@ -460,15 +470,15 @@ void igt_simple_init_parse_opts(int *argc, char **argv,
  * #igt_simple_init_parse_opts.
  */
 #define igt_simple_main_args(short_opts, long_opts, help_str, opt_handler, handler_data) \
-	static void igt_tokencat(__real_main, __LINE__)(void); \
+	static void igt_unique(__real_main)(void); \
 	int main(int argc, char **argv) { \
 		igt_simple_init_parse_opts(&argc, argv, \
 					   short_opts, long_opts, help_str, \
 					   opt_handler, handler_data);	\
-		igt_tokencat(__real_main, __LINE__)(); \
+		igt_unique(__real_main)(); \
 		igt_exit(); \
 	} \
-	static void igt_tokencat(__real_main, __LINE__)(void) \
+	static void igt_unique(__real_main)(void) \
 
 
 /**
@@ -490,7 +500,7 @@ void igt_simple_init_parse_opts(int *argc, char **argv,
  */
 #define igt_constructor \
 	__attribute__((constructor)) \
-	static void igt_tokencat(__igt_constructor_l, __LINE__)(void)
+	static void igt_unique(__igt_constructor_l)(void)
 
 __noreturn __attribute__((format(printf, 1, 2)))
 void igt_skip(const char *f, ...);
-- 
2.33.0



More information about the igt-dev mailing list