From 48099af9fed7497a230992e41d559a19c5dbdc60 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 25 Sep 2008 13:24:58 +0100 Subject: [PATCH] [boilerplate] Retry conversion in process if first attempt fails. One possibility for a read failure whilst converting the image is if the external utility crashed. This information is important for the test suite as knowing input that causes the converter to crash is just as vital as identifying a crash within the library. --- boilerplate/cairo-boilerplate-pdf.c | 11 +-------- boilerplate/cairo-boilerplate-svg.c | 11 +-------- boilerplate/cairo-boilerplate.c | 35 +++++++++++++++++++++++++++-- boilerplate/cairo-boilerplate.h | 11 +++++++-- 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/boilerplate/cairo-boilerplate-pdf.c b/boilerplate/cairo-boilerplate-pdf.c index fb7d1aa2f..470fb06d2 100644 --- a/boilerplate/cairo-boilerplate-pdf.c +++ b/boilerplate/cairo-boilerplate-pdf.c @@ -178,17 +178,8 @@ _cairo_boilerplate_pdf_convert_to_image (cairo_surface_t *surface) { pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key); - FILE *file; - cairo_surface_t *image; - - file = cairo_boilerplate_open_any2ppm (ptc->filename, 1); - if (file == NULL) - return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); - - image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); - fclose (file); - return image; + return cairo_boilerplate_convert_to_image (ptc->filename, 1); } cairo_surface_t * diff --git a/boilerplate/cairo-boilerplate-svg.c b/boilerplate/cairo-boilerplate-svg.c index 7a07d1b37..c3ad8d2fe 100644 --- a/boilerplate/cairo-boilerplate-svg.c +++ b/boilerplate/cairo-boilerplate-svg.c @@ -170,17 +170,8 @@ _cairo_boilerplate_svg_convert_to_image (cairo_surface_t *surface) { svg_target_closure_t *ptc = cairo_surface_get_user_data (surface, &svg_closure_key); - FILE *file; - cairo_surface_t *image; - - file = cairo_boilerplate_open_any2ppm (ptc->filename, 0); - if (file == NULL) - return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); - - image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); - fclose (file); - return image; + return cairo_boilerplate_convert_to_image (ptc->filename, 0); } cairo_surface_t * diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index 039fb3dee..65898e16f 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -706,7 +706,8 @@ any2ppm_daemon_exists (void) FILE * cairo_boilerplate_open_any2ppm (const char *filename, - int page) + int page, + unsigned int flags) { char command[4096]; #if HAS_DAEMON @@ -714,6 +715,9 @@ cairo_boilerplate_open_any2ppm (const char *filename, struct sockaddr_un addr; int len; + if (flags & CAIRO_BOILERPLATE_OPEN_NO_DAEMON) + goto POPEN; + if (! any2ppm_daemon_exists ()) { if (system ("./any2ppm") != 0) goto POPEN; @@ -747,7 +751,7 @@ cairo_boilerplate_open_any2ppm (const char *filename, } static cairo_bool_t -freadn (char *buf, int len, FILE *file) +freadn (unsigned char *buf, int len, FILE *file) { int ret; @@ -822,6 +826,33 @@ cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file) return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); } +cairo_surface_t * +cairo_boilerplate_convert_to_image (const char *filename, int page) +{ + FILE *file; + unsigned int flags = 0; + cairo_surface_t *image; + + RETRY: + file = cairo_boilerplate_open_any2ppm (filename, 1, flags); + if (file == NULL) + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); + + image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); + fclose (file); + + if (cairo_surface_status (image) == CAIRO_STATUS_READ_ERROR) { + if (flags == 0) { + /* Try again in process, e.g. to propagate a CRASH. */ + cairo_surface_destroy (image); + flags = CAIRO_BOILERPLATE_OPEN_NO_DAEMON; + goto RETRY; + } + } + + return image; +} + int cairo_boilerplate_version (void) { diff --git a/boilerplate/cairo-boilerplate.h b/boilerplate/cairo-boilerplate.h index df2da0913..7b6dbc31c 100644 --- a/boilerplate/cairo-boilerplate.h +++ b/boilerplate/cairo-boilerplate.h @@ -176,13 +176,20 @@ cairo_boilerplate_get_image_surface_from_png (const char *filename, cairo_surface_t * cairo_boilerplate_surface_create_in_error (cairo_status_t status); +enum { + CAIRO_BOILERPLATE_OPEN_NO_DAEMON = 0x1, +}; + FILE * cairo_boilerplate_open_any2ppm (const char *filename, - int page); - + int page, + unsigned int flags); cairo_surface_t * cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file); +cairo_surface_t * +cairo_boilerplate_convert_to_image (const char *filename, int page); + int cairo_boilerplate_version (void);