fdr,tee: Reorder master/slave invocation to capture death-upon-signals

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2011-09-16 13:47:17 +01:00
parent 983cfb2f54
commit 35f41d253f
2 changed files with 58 additions and 52 deletions

View file

@ -209,10 +209,6 @@ _cairo_tee_surface_paint (void *abstract_surface,
int n, num_slaves;
cairo_int_status_t status;
status = _cairo_surface_wrapper_paint (&surface->master, op, source, clip);
if (unlikely (status))
return status;
num_slaves = _cairo_array_num_elements (&surface->slaves);
slaves = _cairo_array_index (&surface->slaves, 0);
for (n = 0; n < num_slaves; n++) {
@ -221,7 +217,7 @@ _cairo_tee_surface_paint (void *abstract_surface,
return status;
}
return CAIRO_STATUS_SUCCESS;
return _cairo_surface_wrapper_paint (&surface->master, op, source, clip);
}
static cairo_int_status_t
@ -236,11 +232,6 @@ _cairo_tee_surface_mask (void *abstract_surface,
cairo_int_status_t status;
int n, num_slaves;
status = _cairo_surface_wrapper_mask (&surface->master,
op, source, mask, clip);
if (unlikely (status))
return status;
num_slaves = _cairo_array_num_elements (&surface->slaves);
slaves = _cairo_array_index (&surface->slaves, 0);
for (n = 0; n < num_slaves; n++) {
@ -250,7 +241,8 @@ _cairo_tee_surface_mask (void *abstract_surface,
return status;
}
return CAIRO_STATUS_SUCCESS;
return _cairo_surface_wrapper_mask (&surface->master,
op, source, mask, clip);
}
static cairo_int_status_t
@ -270,15 +262,6 @@ _cairo_tee_surface_stroke (void *abstract_surface,
cairo_int_status_t status;
int n, num_slaves;
status = _cairo_surface_wrapper_stroke (&surface->master,
op, source,
path, style,
ctm, ctm_inverse,
tolerance, antialias,
clip);
if (unlikely (status))
return status;
num_slaves = _cairo_array_num_elements (&surface->slaves);
slaves = _cairo_array_index (&surface->slaves, 0);
for (n = 0; n < num_slaves; n++) {
@ -292,7 +275,12 @@ _cairo_tee_surface_stroke (void *abstract_surface,
return status;
}
return CAIRO_STATUS_SUCCESS;
return _cairo_surface_wrapper_stroke (&surface->master,
op, source,
path, style,
ctm, ctm_inverse,
tolerance, antialias,
clip);
}
static cairo_int_status_t
@ -310,14 +298,6 @@ _cairo_tee_surface_fill (void *abstract_surface,
cairo_int_status_t status;
int n, num_slaves;
status = _cairo_surface_wrapper_fill (&surface->master,
op, source,
path, fill_rule,
tolerance, antialias,
clip);
if (unlikely (status))
return status;
num_slaves = _cairo_array_num_elements (&surface->slaves);
slaves = _cairo_array_index (&surface->slaves, 0);
for (n = 0; n < num_slaves; n++) {
@ -330,7 +310,11 @@ _cairo_tee_surface_fill (void *abstract_surface,
return status;
}
return CAIRO_INT_STATUS_SUCCESS;
return _cairo_surface_wrapper_fill (&surface->master,
op, source,
path, fill_rule,
tolerance, antialias,
clip);
}
static cairo_bool_t
@ -364,18 +348,6 @@ _cairo_tee_surface_show_text_glyphs (void *abstract_surface,
if (unlikely (glyphs_copy == NULL))
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs);
status = _cairo_surface_wrapper_show_text_glyphs (&surface->master, op,
source,
utf8, utf8_len,
glyphs_copy, num_glyphs,
clusters, num_clusters,
cluster_flags,
scaled_font,
clip);
if (unlikely (status))
goto CLEANUP;
num_slaves = _cairo_array_num_elements (&surface->slaves);
slaves = _cairo_array_index (&surface->slaves, 0);
for (n = 0; n < num_slaves; n++) {
@ -392,7 +364,16 @@ _cairo_tee_surface_show_text_glyphs (void *abstract_surface,
goto CLEANUP;
}
CLEANUP:
memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs);
status = _cairo_surface_wrapper_show_text_glyphs (&surface->master, op,
source,
utf8, utf8_len,
glyphs_copy, num_glyphs,
clusters, num_clusters,
cluster_flags,
scaled_font,
clip);
CLEANUP:
free (glyphs_copy);
return status;
}
@ -499,27 +480,26 @@ cairo_tee_surface_remove (cairo_surface_t *abstract_surface,
{
cairo_tee_surface_t *surface;
cairo_surface_wrapper_t *slaves;
cairo_int_status_t status;
int n, num_slaves;
if (unlikely (abstract_surface->status))
return;
if (unlikely (abstract_surface->finished)) {
status = _cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
_cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
return;
}
if (abstract_surface->backend != &cairo_tee_surface_backend) {
status = _cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH));
_cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH));
return;
}
surface = (cairo_tee_surface_t *) abstract_surface;
if (target == surface->master.target) {
status = _cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
_cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
return;
}
@ -531,8 +511,8 @@ cairo_tee_surface_remove (cairo_surface_t *abstract_surface,
}
if (n == num_slaves) {
status = _cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
_cairo_surface_set_error (abstract_surface,
_cairo_error (CAIRO_STATUS_INVALID_INDEX));
return;
}

View file

@ -84,6 +84,12 @@ fdr_sighandler (int sig)
fdr_dump = 1;
}
static void
fdr_urgent_sighandler (int sig)
{
fdr_dump_ringbuffer ();
}
static void
fdr_atexit (void)
{
@ -100,6 +106,9 @@ fdr_pending_signals (void)
initialized = 1;
signal (SIGUSR1, fdr_sighandler);
signal (SIGSEGV, fdr_urgent_sighandler);
signal (SIGABRT, fdr_urgent_sighandler);
atexit (fdr_atexit);
}
@ -303,3 +312,20 @@ cairo_surface_create_similar (cairo_surface_t *surface,
return DLCALL (cairo_surface_create_similar,
surface, content, width, height);
}
cairo_surface_t *
cairo_surface_create_for_rectangle (cairo_surface_t *surface,
double x,
double y,
double width,
double height)
{
cairo_surface_t *tee;
tee = fdr_surface_get_tee (surface);
if (tee != NULL)
surface = tee;
return DLCALL (cairo_surface_create_for_rectangle,
surface, x, y, width, height);
}