boilerplate: Ensure that the recording surfaces are finished.

Be paranoid and explicitly call finish to cleanup self-referential leaks
when using paginated/recording surfaces.
This commit is contained in:
Chris Wilson 2010-04-29 21:50:22 +01:00
parent f08cc311af
commit 3ae5723464
4 changed files with 17 additions and 8 deletions

View file

@ -137,6 +137,7 @@ _cairo_boilerplate_pdf_finish_surface (cairo_surface_t *surface)
if (status) if (status)
return status; return status;
cairo_surface_finish (surface);
status = cairo_surface_status (surface); status = cairo_surface_status (surface);
if (status) if (status)
return status; return status;
@ -204,8 +205,10 @@ static void
_cairo_boilerplate_pdf_cleanup (void *closure) _cairo_boilerplate_pdf_cleanup (void *closure)
{ {
pdf_target_closure_t *ptc = closure; pdf_target_closure_t *ptc = closure;
if (ptc->target) if (ptc->target) {
cairo_surface_finish (ptc->target);
cairo_surface_destroy (ptc->target); cairo_surface_destroy (ptc->target);
}
free (ptc->filename); free (ptc->filename);
free (ptc); free (ptc);
} }

View file

@ -197,6 +197,7 @@ _cairo_boilerplate_ps_finish_surface (cairo_surface_t *surface)
if (status) if (status)
return status; return status;
cairo_surface_finish (surface);
status = cairo_surface_status (surface); status = cairo_surface_status (surface);
if (status) if (status)
return status; return status;
@ -269,8 +270,10 @@ static void
_cairo_boilerplate_ps_cleanup (void *closure) _cairo_boilerplate_ps_cleanup (void *closure)
{ {
ps_target_closure_t *ptc = closure; ps_target_closure_t *ptc = closure;
if (ptc->target) if (ptc->target) {
cairo_surface_finish (ptc->target);
cairo_surface_destroy (ptc->target); cairo_surface_destroy (ptc->target);
}
free (ptc->filename); free (ptc->filename);
free (ptc); free (ptc);
} }

View file

@ -170,6 +170,7 @@ _cairo_boilerplate_svg_finish_surface (cairo_surface_t *surface)
if (status) if (status)
return status; return status;
cairo_surface_finish (surface);
status = cairo_surface_status (surface); status = cairo_surface_status (surface);
if (status) if (status)
return status; return status;
@ -241,8 +242,10 @@ static void
_cairo_boilerplate_svg_cleanup (void *closure) _cairo_boilerplate_svg_cleanup (void *closure)
{ {
svg_target_closure_t *ptc = closure; svg_target_closure_t *ptc = closure;
if (ptc->target) if (ptc->target) {
cairo_surface_finish (ptc->target);
cairo_surface_destroy (ptc->target); cairo_surface_destroy (ptc->target);
}
free (ptc->filename); free (ptc->filename);
free (ptc); free (ptc);
} }

View file

@ -180,13 +180,11 @@ _cairo_boilerplate_recording_create_surface (const char *name,
{ {
cairo_rectangle_t extents; cairo_rectangle_t extents;
*closure = NULL;
extents.x = 0; extents.x = 0;
extents.y = 0; extents.y = 0;
extents.width = width; extents.width = width;
extents.height = height; extents.height = height;
return cairo_recording_surface_create (content, &extents); return *closure = cairo_recording_surface_create (content, &extents);
} }
#endif #endif
@ -353,7 +351,8 @@ static const cairo_boilerplate_target_t builtin_targets[] = {
NULL, NULL, NULL, NULL,
_cairo_boilerplate_get_image_surface, _cairo_boilerplate_get_image_surface,
cairo_surface_write_to_png, cairo_surface_write_to_png,
NULL, NULL, (cairo_boilerplate_cleanup_t) cairo_surface_finish,
NULL,
FALSE, FALSE, TRUE FALSE, FALSE, TRUE
}, },
{ {
@ -364,7 +363,8 @@ static const cairo_boilerplate_target_t builtin_targets[] = {
NULL, NULL, NULL, NULL,
_cairo_boilerplate_get_image_surface, _cairo_boilerplate_get_image_surface,
cairo_surface_write_to_png, cairo_surface_write_to_png,
NULL, NULL, (cairo_boilerplate_cleanup_t) cairo_surface_finish,
NULL,
FALSE, FALSE, TRUE FALSE, FALSE, TRUE
}, },
#endif #endif