From 157074c794903f1dbe68c1ba5b129b4176dc7975 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 18 Apr 2007 19:46:30 -0400 Subject: [PATCH] [boilerplate] Add cairo_boilerplate_get/free_targets This means, test and perf suites now share the same target handling code, including parsing CAIRO_TEST_TARGET. --- boilerplate/cairo-boilerplate.c | 73 +++++++++++++++++++++++++++++++-- boilerplate/cairo-boilerplate.h | 6 ++- perf/cairo-perf.c | 20 ++++----- test/cairo-test.c | 54 ++++-------------------- 4 files changed, 92 insertions(+), 61 deletions(-) diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index 187360cd6..8c739165e 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -1366,7 +1366,7 @@ cleanup_svg (void *closure) } #endif /* CAIRO_HAS_SVG_SURFACE && CAIRO_CAN_TEST_SVG_SURFACE */ -cairo_boilerplate_target_t targets[] = +static cairo_boilerplate_target_t targets[] = { /* I'm uncompromising about leaving the image backend as 0 * for tolerance. There shouldn't ever be anything that is out of @@ -1517,10 +1517,77 @@ cairo_boilerplate_target_t targets[] = { "directfb-bitmap", CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_CONTENT_COLOR_ALPHA, 0, create_directfb_surface, cairo_surface_write_to_png,cleanup_directfb}, #endif - - { NULL } }; +cairo_boilerplate_target_t ** +cairo_boilerplate_get_targets (int *pnum_targets, cairo_bool_t *plimited_targets) +{ + size_t i, num_targets; + cairo_bool_t limited_targets = FALSE; + const char *tname; + cairo_boilerplate_target_t **targets_to_test; + + if ((tname = getenv ("CAIRO_TEST_TARGET")) != NULL && *tname) { + + limited_targets = TRUE; + + num_targets = 0; + targets_to_test = NULL; + + while (*tname) { + int found = 0; + const char *end = strpbrk (tname, " \t\r\n;:,"); + if (!end) + end = tname + strlen (tname); + + if (end == tname) { + tname = end + 1; + continue; + } + + for (i = 0; i < sizeof (targets) / sizeof (targets[0]); i++) { + if (0 == strncmp (targets[i].name, tname, end - tname) && + !isalnum (targets[i].name[end - tname])) { + /* realloc isn't exactly the best thing here, but meh. */ + targets_to_test = realloc (targets_to_test, sizeof(cairo_boilerplate_target_t *) * (num_targets+1)); + targets_to_test[num_targets++] = &targets[i]; + found = 1; + } + } + + if (!found) { + fprintf (stderr, "Cannot find target '%.*s'\n", (int)(end - tname), tname); + exit(-1); + } + + if (*end) + end++; + tname = end; + } + } else { + num_targets = sizeof (targets) / sizeof (targets[0]); + targets_to_test = malloc (sizeof(cairo_boilerplate_target_t*) * num_targets); + for (i = 0; i < num_targets; i++) { + targets_to_test[i] = &targets[i]; + } + } + + if (pnum_targets) + *pnum_targets = num_targets; + + if (plimited_targets) + *plimited_targets = limited_targets; + + return targets_to_test; +} + +void +cairo_boilerplate_free_targets (cairo_boilerplate_target_t **targets) +{ + free (targets); +} + + void xasprintf (char **strp, const char *fmt, ...) { diff --git a/boilerplate/cairo-boilerplate.h b/boilerplate/cairo-boilerplate.h index 6c079c976..c9e6ef09d 100644 --- a/boilerplate/cairo-boilerplate.h +++ b/boilerplate/cairo-boilerplate.h @@ -123,7 +123,11 @@ typedef struct _cairo_boilerplate_target void *closure; } cairo_boilerplate_target_t; -extern cairo_boilerplate_target_t targets[]; +cairo_boilerplate_target_t ** +cairo_boilerplate_get_targets (int *num_targets, cairo_bool_t *limited_targets); + +void +cairo_boilerplate_free_targets (cairo_boilerplate_target_t **targets); #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \ diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c index 6c664873d..993345ca8 100644 --- a/perf/cairo-perf.c +++ b/perf/cairo-perf.c @@ -302,11 +302,10 @@ check_cpu_affinity(void) int main (int argc, char *argv[]) { - int i, j; + int i, j, num_targets; cairo_perf_case_t *perf_case; cairo_perf_t perf; - const char *cairo_test_target = getenv ("CAIRO_TEST_TARGET"); - cairo_boilerplate_target_t *target; + cairo_boilerplate_target_t **targets; cairo_surface_t *surface; parse_options (&perf, argc, argv); @@ -324,17 +323,16 @@ main (int argc, char *argv[]) stderr); } - if (!*cairo_test_target) - cairo_test_target = NULL; + targets = cairo_boilerplate_get_targets (&num_targets, NULL); - for (i = 0; targets[i].name; i++) { - perf.target = target = &targets[i]; - perf.test_number = 0; + for (i = 0; i < num_targets; i++) { + cairo_boilerplate_target_t *target = targets[i]; if (! target_is_measurable (target)) continue; - if (cairo_test_target && ! strstr (cairo_test_target, target->name)) - continue; + + perf.target = target; + perf.test_number = 0; for (j = 0; perf_cases[j].run; j++) { @@ -378,6 +376,8 @@ main (int argc, char *argv[]) } } + cairo_boilerplate_free_targets (targets); + return 0; } diff --git a/test/cairo-test.c b/test/cairo-test.c index ef34a042f..1582d9348 100755 --- a/test/cairo-test.c +++ b/test/cairo-test.c @@ -383,7 +383,6 @@ cairo_test_expecting (cairo_test_t *test, * by longjmp */ volatile size_t i, j, num_targets; volatile cairo_bool_t limited_targets = FALSE, print_fail_on_stdout = TRUE; - const char *tname; #ifdef HAVE_SIGNAL_H void (*old_segfault_handler)(int); #endif @@ -409,51 +408,12 @@ cairo_test_expecting (cairo_test_t *test, if (expectation == CAIRO_TEST_FAILURE) printf ("Expecting failure\n"); - if ((tname = getenv ("CAIRO_TEST_TARGET")) != NULL && *tname) { - - limited_targets = TRUE; - - num_targets = 0; - targets_to_test = NULL; - - while (*tname) { - int found = 0; - const char *end = strpbrk (tname, " \t\r\n;:,"); - if (!end) - end = tname + strlen (tname); - - if (end == tname) { - tname = end + 1; - continue; - } - - for (i = 0; targets[i].name != NULL; i++) { - if (0 == strncmp (targets[i].name, tname, end - tname) && - !isalnum (targets[i].name[end - tname])) { - /* realloc isn't exactly the best thing here, but meh. */ - targets_to_test = realloc (targets_to_test, sizeof(cairo_boilerplate_target_t *) * (num_targets+1)); - targets_to_test[num_targets++] = &targets[i]; - found = 1; - } - } - - if (!found) { - fprintf (stderr, "Cannot test target '%.*s'\n", (int)(end - tname), tname); - exit(-1); - } - - if (*end) - end++; - tname = end; - } - } else { - num_targets = 0; - for (i = 0; targets[i].name != NULL; i++) - num_targets++; - targets_to_test = malloc (sizeof(cairo_boilerplate_target_t*) * num_targets); - for (i = 0; i < num_targets; i++) { - targets_to_test[i] = &targets[i]; - } + { + int tmp_num_targets; + cairo_bool_t tmp_limited_targets; + targets_to_test = cairo_boilerplate_get_targets (&tmp_num_targets, &tmp_limited_targets); + num_targets = tmp_num_targets; + limited_targets = tmp_limited_targets; } /* The intended logic here is that we return overall SUCCESS @@ -583,7 +543,7 @@ cairo_test_expecting (cairo_test_t *test, cairo_test_fini (); - free (targets_to_test); + cairo_boilerplate_free_targets (targets_to_test); return ret; }