SVN commit 567460 by mwiesweg:
Kill the preview ioslave each time properly so that is frees its Shared Memory. Note: It seems that the usage of Shared Memory is dangerous, as the segments are not freed when the application crashes. BUG: 131277 CCMAIL: [hidden email] M +6 -0 imagepreviewjob.cpp M +19 -5 imagepreviewwidget.cpp --- trunk/extragear/graphics/digikam/digikam/imagepreviewjob.cpp #567459:567460 @@ -173,6 +173,12 @@ stream >> width >> height >> depth; preview = QImage(d->shmaddr, width, height, depth, 0, 0, QImage::IgnoreEndian); + + // The buffer supplied to the QImage constructor above must remain valid + // throughout the lifetime of the object. + // This is not true, the shared memory will be freed or reused. + // If we pass the object around, we must do a deep copy. + preview = preview.copy(); } else { --- trunk/extragear/graphics/digikam/digikam/imagepreviewwidget.cpp #567459:567460 @@ -91,11 +91,11 @@ ImagePreviewWidget::~ImagePreviewWidget() { - if (!d->previewJob.isNull()) + if (d->previewJob) d->previewJob->kill(); - + d->blinkPreviewTimer->stop(); - + delete d; } @@ -107,6 +107,9 @@ d->previewBlink = false; d->blinkPreviewTimer->start(200); + if (d->previewJob) + d->previewJob->kill(); + d->previewJob = new ImagePreviewJob(KURL(path), 1024, AlbumSettings::instance()->getExifRotate()); connect(d->previewJob, SIGNAL(signalImagePreview(const KURL&, const QImage&)), @@ -129,9 +132,16 @@ void ImagePreviewWidget::slotGotImagePreview(const KURL&, const QImage& preview) { d->blinkPreviewTimer->stop(); - d->previewJob = 0; d->preview = preview; d->pixmap = QPixmap(contentsRect().size()); + + // It is very important to kill the thumbnail job properly + // so that is frees its shared memory. Otherwise the memory + // will _never_ be freed, see b.k.o. #131277 + if (d->previewJob) + d->previewJob->kill(); + d->previewJob = 0; + updatePixmap(); repaint(false); emit previewComplete(); @@ -140,7 +150,11 @@ void ImagePreviewWidget::slotFailedImagePreview(const KURL&) { d->blinkPreviewTimer->stop(); - d->previewJob = 0; + + if (d->previewJob) + d->previewJob->kill(); + d->previewJob = 0; + d->preview = QImage(); d->pixmap = QPixmap(contentsRect().size()); updatePixmap(); _______________________________________________ Digikam-devel mailing list [hidden email] https://mail.kde.org/mailman/listinfo/digikam-devel |
Free forum by Nabble | Edit this page |