xlib: Bump reference count for recording surface replays

Graphics / Cairo - Chris Wilson [chris-wilson.co.uk] - 31 December 2014 05:01 UTC

The snapshot takes a reference to the target recording surface in order to enable it for use by multiple treads. In order to balance this, the other two sources of recording surface must also take a reference and for us to release that reference after the replay.

Otherwise, we end up with a memory leak:

==1== 1,392 bytes in 3 blocks are definitely lost in loss record 1 of 7
==1== at 0x4A06BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==1== by 0x4C7042D: _cairo_recording_surface_snapshot (cairo/src/cairo-recording-surface.c:1427)
==1== by 0x4C842BE: _cairo_surface_snapshot_copy_on_write (cairo/src/cairo-surface-snapshot.c:189)
==1== by 0x4C7E7E0: _cairo_surface_detach_snapshot (cairo/src/cairo-surface.c:348)
==1== by 0x4C7E55B: _cairo_surface_detach_snapshots (cairo/src/cairo-surface.c:333)
==1== by 0x4C7E55B: _cairo_surface_flush (cairo/src/cairo-surface.c:1545)
==1== by 0x4C7E6CC: _cairo_surface_finish_snapshots (cairo/src/cairo-surface.c:1017)
==1== by 0x4C7E6CC: cairo_surface_destroy (cairo/src/cairo-surface.c:961)
==1== by 0x4C625A7: cairo_pattern_destroy (cairo/src/cairo-pattern.c:1131)
==1== by 0x4C3FAC6: _cairo_gstate_fini (cairo/src/cairo-gstate.c:225)
==1== by 0x4C3C68C: _cairo_default_context_fini (cairo/src/cairo-default-context.c:75)
==1== by 0x4C3C708: _cairo_default_context_destroy (cairo/src/cairo-default-context.c:93)
==1== by 0x43E576: record_get (cairo/test/record-extend.c:158)
==1== by 0x43E576: record_replay (cairo/test/record-extend.c:173)
==1== by 0x40E22D: cairo_test_for_target (cairo/test/cairo-test.c:929)
==1== by 0x40E22D: _cairo_test_context_run_for_target (cairo/test/cairo-test.c:1532)
==1== by 0x40B6C0: _cairo_test_runner_draw (cairo/test/cairo-test-runner.c:255)
==1== by 0x40B6C0: main (cairo/test/cairo-test-runner.c:937)

028d286 xlib: Bump reference count for recording surface replays
src/cairo-xlib-source.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)

Upstream: cgit.freedesktop.org


  • Share