[Digikam-devel] [spam detected by bogofilter] extragear/graphics/digikam/libs/dimg/filters
Gerhard Kulzer
gerhard at kulzer.net
Thu Oct 26 10:44:04 BST 2006
Hi Gilles,
I tried it at once of course, since I'm running hyperthreaded, and I got this
good-bye message when I clicked on the unsharp menu:
digikam: Preview unsharp started...
digikam: symbol lookup error: /usr/lib/kde3/digikamimageplugin_unsharp.so:
undefined symbol:
_ZN7Digikam18DImgThreadedFilterC2EPNS_4DImgEP7QObject7QString
I did a clean built from svn before.
Gerhard
Am Donnerstag, 26. Oktober 2006 08:24 schrieb Gilles Caulier:
> SVN commit 599179 by cgilles:
>
> digikam from trunk : make a deep copy of QString in threaded image filter
> constructor to prevent crash into Hyperthreading CPU.
>
> To digiKam users : feedback is welcome...
>
> CCBUGS:133026
> CCMAIL: digikam-devel at kde.org
>
> M +33 -25 dimgthreadedfilter.cpp
> M +33 -31 dimgthreadedfilter.h
>
>
> ---
> trunk/extragear/graphics/digikam/libs/dimg/filters/dimgthreadedfilter.cpp
> #599178:599179 @@ -1,5 +1,4 @@
> /* ============================================================
> - * File : dimgthreadedfilter.cpp
> * Author: Gilles Caulier <caulier dot gilles at kdemail dot net>
> * Date : 2005-05-25
> * Description : threaded image filter class.
> @@ -24,6 +23,7 @@
> #include <qobject.h>
> #include <qdatetime.h>
> #include <qevent.h>
> +#include <qdeepcopy.h>
>
> // KDE includes.
>
> @@ -36,34 +36,42 @@
> namespace Digikam
> {
>
> -DImgThreadedFilter::DImgThreadedFilter(DImg *orgImage, QObject *parent,
> QString name) +DImgThreadedFilter::DImgThreadedFilter(DImg *orgImage,
> QObject *parent, + const QString&
> name)
>
> : QThread()
>
> {
> // remove meta data
> - m_orgImage = orgImage->copyImageData();
> - m_parent = parent;
> - m_cancel = false;
> - m_name = name;
> + m_orgImage = orgImage->copyImageData();
> + m_parent = parent;
> + m_cancel = false;
>
> - m_master = 0;
> - m_slave = 0;
> + // See B.K.O #133026: make a deep copy of Qstring to prevent crash
> + // on Hyperthreading computer.
> + m_name = QDeepCopy<QString>(name);
> +
> + m_master = 0;
> + m_slave = 0;
> m_progressBegin = 0;
> m_progressSpan = 100;
> }
>
> -DImgThreadedFilter::DImgThreadedFilter(DImgThreadedFilter *master, const
> DImg &orgImage, const DImg &destImage, -
> int progressBegin, int progressEnd, QString name)
> +DImgThreadedFilter::DImgThreadedFilter(DImgThreadedFilter *master, const
> DImg &orgImage, + const DImg
> &destImage, int progressBegin, int progressEnd, +
> const QString& name)
> {
> - m_orgImage = orgImage;
> - m_destImage = destImage;
> - m_parent = 0;
> - m_cancel = false;
> - m_name = name;
> + m_orgImage = orgImage;
> + m_destImage = destImage;
> + m_parent = 0;
> + m_cancel = false;
>
> - m_master = master;
> - m_slave = 0;
> + // See B.K.O #133026: make a deep copy of Qstring to prevent crash
> + // on Hyperthreading computer.
> + m_name = QDeepCopy<QString>(name);
> +
> + m_master = master;
> + m_slave = 0;
> m_progressBegin = progressBegin;
> - m_progressSpan = progressEnd - progressBegin;
> + m_progressSpan = progressEnd - progressBegin;
>
> m_master->setSlave(this);
> }
> @@ -75,8 +83,6 @@
> m_master->setSlave(0);
> }
>
> -
> -
> void DImgThreadedFilter::initFilter(void)
> {
> m_destImage.reset();
> @@ -123,9 +129,9 @@
> else if (m_parent)
> {
> EventData *eventData = new EventData();
> - eventData->progress = progress;
> - eventData->starting = starting;
> - eventData->success = success;
> + eventData->progress = progress;
> + eventData->starting = starting;
> + eventData->success = success;
> QApplication::postEvent(m_parent, new QCustomEvent(QEvent::User,
> eventData)); }
> }
> @@ -150,7 +156,8 @@
> postProgress(0, false, true);
>
> kdDebug() << m_name
> - << "::End of computation !!! ... ( " <<
> startDate.secsTo(endDate) << " s )" << endl; + << "::End of
> computation !!! ... ( " << startDate.secsTo(endDate) << " s )" +
> << endl;
> }
> else
> {
> @@ -158,7 +165,8 @@
> postProgress(0, false, false);
>
> kdDebug() << m_name
> - << "::Computation aborted... ( " <<
> startDate.secsTo(endDate) << " s )" << endl; + <<
> "::Computation aborted... ( " << startDate.secsTo(endDate) << " s )" +
> << endl;
> }
> }
>
> --- trunk/extragear/graphics/digikam/libs/dimg/filters/dimgthreadedfilter.h
> #599178:599179 @@ -1,5 +1,4 @@
> /* ============================================================
> - * File : dimgthreadedfilter.h
> * Author: Gilles Caulier <caulier dot gilles at kdemail dot net>
> * Date : 2005-05-25
> * Description : threaded image filter class.
> @@ -46,8 +45,7 @@
>
> public:
>
> -// Class used to post status of computation to parent.
> -
> +/** Class used to post status of computation to parent. */
> class EventData
> {
> public:
> @@ -65,7 +63,8 @@
>
> public:
>
> - DImgThreadedFilter(DImg *orgImage, QObject *parent=0, QString
> name=QString::null); + DImgThreadedFilter(DImg *orgImage, QObject
> *parent=0,
> + const QString& name=QString::null);
>
> ~DImgThreadedFilter();
>
> @@ -78,49 +77,44 @@
>
> protected:
>
> - // Copy of original Image data.
> + /** Copy of original Image data. */
> DImg m_orgImage;
>
> - // Output image data.
> + /** Output image data. */
> DImg m_destImage;
>
> - // Filter name.
> + /** Filter name.*/
> QString m_name;
>
> - // Used to stop compution loop.
> + /** Used to stop compution loop. */
> bool m_cancel;
>
> - // To post event from thread to parent.
> + /** To post event from thread to parent. */
> QObject *m_parent;
>
> protected:
>
> - // Start filter operation before threaded method. Must be calls by
> your constructor. + /** Start filter operation before threaded method.
> Must be calls by your constructor. */ virtual void initFilter(void);
>
> - // List of threaded operations by filter.
> + /** List of threaded operations by filter. */
> virtual void run(){ startComputation(); };
>
> - // Main image filter method.
> + /** Main image filter method. */
> virtual void filterImage(void){};
>
> - // Clean up filter data if necessary. Call by stopComputation()
> method. + /** Clean up filter data if necessary. Call by
> stopComputation() method. */ virtual void cleanupFilter(void){};
>
> - // Post Event to parent about progress. Warning: you need to delete
> - // 'EventData' instance to 'customEvent' parent implementation.
> + /** Post Event to parent about progress. Warning: you need to delete
> + 'EventData' instance to 'customEvent' parent implementation. */
> void postProgress(int progress=0, bool starting=true, bool
> success=false); -
> +
> protected:
>
> - // Support for chaining two filters as master and thread
> + /**
> + Support for chaining two filters as master and thread.
>
> - // The current slave. Any filter might want to use another filter
> while processing. - DImgThreadedFilter *m_slave;
> - // The master of this slave filter. Progress info will be routed to
> this one. - DImgThreadedFilter *m_master;
> -
> - /*
> Constructor for slave mode:
> Constructs a new slave filter with the specified master.
> The filter will be executed in the current thread.
> @@ -129,20 +123,28 @@
> that the slave filter uses in the parent filter's progress.
> Any derived filter class that is publicly available to other filters
> should implement an additional constructor using this constructor.
> - */
> + */
> DImgThreadedFilter(DImgThreadedFilter *master, const DImg &orgImage,
> const DImg &destImage, - int progressBegin=0, int
> progressEnd=100, QString name=QString::null); + int
> progressBegin=0, int progressEnd=100, const QString& name=QString::null);
>
> - // inform the master that there is currently a slave. At destruction
> of the slave, call with slave=0. + /** Inform the master that there is
> currently a slave. At destruction of the slave, call with slave=0. */ void
> setSlave(DImgThreadedFilter *slave);
>
> - // The progress span that a slave filter uses in the parent filter's
> progress + /** This method modulates the progress value from the 0..100
> span to the span of this slave. + Called by postProgress if master
> is not null. */
> + virtual int modulateProgress(int progress);
> +
> +protected:
> +
> + /** The current slave. Any filter might want to use another filter
> while processing. */ + DImgThreadedFilter *m_slave;
> +
> + /** The master of this slave filter. Progress info will be routed to
> this one. */ + DImgThreadedFilter *m_master;
> +
> + /** The progress span that a slave filter uses in the parent filter's
> progress. */ int m_progressBegin;
> int m_progressSpan;
> - // This method modulates the progress value from the 0..100 span to
> the span of this slave. - // Called by postProgress if master is not
> null.
> - virtual int modulateProgress(int progress);
> -
> };
>
> } // NameSpace Digikam
> _______________________________________________
> Digikam-devel mailing list
> Digikam-devel at kde.org
> https://mail.kde.org/mailman/listinfo/digikam-devel
--
http://www.gerhard.fr
More information about the Digikam-devel
mailing list