I've been holding off for some time on sending in this patch but since
there's talk of a release I thought I'd go ahead now. It fixes a SEGV
crasher as explained in the commit message. It's a sporadic bug, to
reproduce I flip back and forth between fullscreen mode and between
images and eventually it crashes, perhaps triggered by a race condition.
Lacking a deterministic test case means of course that it's hard to say
with 100% confidence that it's fixed but I'm quite certain since it
crashes very regularly for me without the fix.
I hadn't sent in the patch yet because I also have another fix for it,
which is slightly more complex and retains the existing read-ahead
image-loader on the new image object, but I have found no noticeable
difference in performance and as always, complexity is the enemy of
correctness and the friend of bloat, so I'm submitting the simpler
patch.
It's a nasty crasher, but perhaps not many others noticed it due to some
peculiarity of my setup, which amongst other things is dual-head/randr.
-- David
-- >8 --
Subject: Fix SEGV crasher (fullscreen + read-ahead)
When entering fullscreen, if not the "same region" as the "normal"
window, and the normal window had an active read-ahead image-loader,
crashed with a nasty SEGV when the read-ahead image-loader delivered its
'done' callback in image_read_ahead_done_cb() because imd->read_ahead_fd
was null pointer but deferenced.
Apparently no similar bug exists when entering fullscreen for "not same
region" ['copy' rather than 'move' the image object], the code for which
transfers the read-ahead image-loader to the new instance and cleans up
the references.
This patch simply cancels the read-ahead rather than transferring it for
the 'move' case, which is simpler and seems not to have any noticeable
adverse performance effects (from my testing).
Signed-off-by: David Favro
---
src/image.c | 8
1 file changed, 8 insertions(+)
diff --git a/src/image.c b/src/image.c
index 12fe8fe..8d4cf0e 100644
--- a/src/image.c
+++ b/src/image.c
@@ -1195,6 +1195,14 @@ void image_move_from_image(ImageWindow *imd, ImageWindow
*source)
color_man_free((ColorMan *)imd->cm);
imd->cm = NULL;
+ /* Cancel the read-ahead: this avoids a race-condition crasher (in
+* the "done" signal's callback) when an image is 'moved' with an
+* active read-ahead image-loader.
+*/
+ if ( source->read_ahead_il ) {
+ image_read_ahead_cancel(source);
+ imd->read_ahead_il = NULL;
+ }
file_data_unref(imd->read_ahead_fd);
source->read_ahead_fd = NULL;
--
1.9.0.rc3
--
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk
___
Geeqie-devel mailing list
Geeqie-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geeqie-devel