From kde-core-devel Thu Jan 01 19:16:10 2004 From: Maks Orlovich Date: Thu, 01 Jan 2004 19:16:10 +0000 To: kde-core-devel Subject: Re: QMovie leaking lots of pixmap resources Message-Id: <200401011416.10522.mo002j () mail ! rochester ! edu> X-MARC-Message: https://marc.info/?l=kde-core-devel&m=107298440324722 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--Boundary-00=_6HH9/SueWldIfX9" --Boundary-00=_6HH9/SueWldIfX9 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline On Thursday 01 January 2004 01:39 pm, Martijn Klingens wrote: > On Thursday 01 January 2004 19:06, Dirk Mueller wrote: > > they might be a trigger but not the cause. the pixmapcache size is > > limited to 1MB in total, so it can't leak, even though you found an > > inefficiency here (I agree the if should be changed to timer >= 0 && loop > > >= 0). The attached two diffs may be helpful in debugging those things, as they let one dump all pixmaps over dcop. The first one applies to Qt; and although the change is local, it does touch qpixmap.h, so you may want to do touch -D "5 years ago" qpixmap.h or such when applying. The other one adds a KDebug method to dump things; the diff also has an unrelated additional method, which I was too lazy to remove... Anyway, if one applies them to Qt and kdecore, and prepares a clean /tmp/dump writeable by the user, doing things like dcop kopete KDebug dumpPixmaps will save all the pixmaps in memory to disk. Note that the black-blue ones are alpha masks associated with "real" pixmaps. Also, at any rate, there do seem to be an awful lot of the spinning Kopete logo pixmaps in there.. -Maks --Boundary-00=_6HH9/SueWldIfX9 Content-Type: text/plain; charset="iso-8859-1"; name="pixmap-dump-qt.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pixmap-dump-qt.diff" diff -u -r qt-x11-free-3.3.0-snapshot-20031218/src/kernel/qpixmap.cpp qt-x11-free-3.3.0-snapshot-20031218.diff/src/kernel/qpixmap.cpp --- qt-x11-free-3.3.0-snapshot-20031218/src/kernel/qpixmap.cpp 2003-12-17 20:50:20.000000000 -0500 +++ qt-x11-free-3.3.0-snapshot-20031218.diff/src/kernel/qpixmap.cpp 2003-12-30 20:05:03.000000000 -0500 @@ -128,7 +128,7 @@ QPixmap::setDefaultOptimization( QPixmap::NormalOptim ); \endcode - In general it is recommended to make as much use of QPixmap's + In general it is recommended to make as much use of QPixmap's implicit sharing and the QPixmapCache as possible. \sa QBitmap, QImage, QImageIO, \link shclass.html Shared Classes\endlink @@ -164,7 +164,7 @@ \value NoOptim No optimization (currently the same as \c MemoryOptim). - \value MemoryOptim Optimize for minimal memory use on Windows + \value MemoryOptim Optimize for minimal memory use on Windows 9x and X11 systems. \value NormalOptim Optimize for typical usage. Often uses more @@ -178,6 +178,44 @@ */ +#include "qmap.h" + +static QMap* pixmapsMap = 0; + +static QMap* pmap() +{ + if (!pixmapsMap) + pixmapsMap = new QMap; + return pixmapsMap; +} + +class PixSetDumper +{ +public: + static void dump() + { + qDebug("Dump called, num pixmaps:%d", pmap()->size()); + QMap dumpedData; + + int pos = 0; + for (QMap::iterator iter = pmap()->begin(); iter != pmap()->end(); ++iter) + { + qDebug("See pixmap:%dx%d@%x", iter.key()->width(), iter.key()->height(), iter.key()->data); + if (dumpedData.contains(iter.key()->data)) + continue; + dumpedData[iter.key()->data] = true; + QString name = QString("/tmp/dump/%1.png").arg(pos); + qDebug("saving..%s", name.latin1()); + iter.key()->convertToImage().save(name,"PNG"); + pos++; + } + } +}; + +void dump_qt_pixmaps() +{ + PixSetDumper::dump(); +} QPixmap::Optimization QPixmap::defOptim = QPixmap::NormalOptim; @@ -191,6 +229,7 @@ Optimization optimization ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( w, h, depth, bitmap, optimization ); } @@ -204,6 +243,7 @@ QPixmap::QPixmap() : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( 0, 0, 0, FALSE, defOptim ); } @@ -216,6 +256,7 @@ QPixmap::QPixmap( const QImage& image ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( 0, 0, 0, FALSE, defOptim ); convertFromImage( image ); } @@ -239,6 +280,7 @@ QPixmap::QPixmap( int w, int h, int depth, Optimization optimization ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( w, h, depth, FALSE, optimization ); } @@ -252,6 +294,7 @@ QPixmap::QPixmap( const QSize &size, int depth, Optimization optimization ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( size.width(), size.height(), depth, FALSE, optimization ); } @@ -278,6 +321,7 @@ int conversion_flags ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( 0, 0, 0, FALSE, defOptim ); load( fileName, format, conversion_flags ); } @@ -299,6 +343,7 @@ QPixmap::QPixmap( const QString& fileName, const char *format, ColorMode mode ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( 0, 0, 0, FALSE, defOptim ); load( fileName, format, mode ); } @@ -329,6 +374,7 @@ QPixmap::QPixmap( const char *xpm[] ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( 0, 0, 0, FALSE, defOptim ); QImage image( xpm ); if ( !image.isNull() ) @@ -345,6 +391,7 @@ QPixmap::QPixmap( const QByteArray & img_data ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; init( 0, 0, 0, FALSE, defOptim ); loadFromData( img_data ); } @@ -357,6 +404,7 @@ QPixmap::QPixmap( const QPixmap &pixmap ) : QPaintDevice( QInternal::Pixmap ) { + (*pmap())[this] = true; if ( pixmap.paintingActive() ) { // make a deep copy data = 0; operator=( pixmap.copy() ); @@ -383,6 +431,7 @@ QPixmap::~QPixmap() { + pmap()->remove(this); deref(); } Only in qt-x11-free-3.3.0-snapshot-20031218.diff/src/kernel: qpixmap.cpp~ diff -u -r qt-x11-free-3.3.0-snapshot-20031218/src/kernel/qpixmap.h qt-x11-free-3.3.0-snapshot-20031218.diff/src/kernel/qpixmap.h --- qt-x11-free-3.3.0-snapshot-20031218/src/kernel/qpixmap.h 2003-12-17 20:50:17.000000000 -0500 +++ qt-x11-free-3.3.0-snapshot-20031218.diff/src/kernel/qpixmap.h 2003-12-30 19:27:46.000000000 -0500 @@ -264,6 +264,7 @@ friend class QPaintDevice; friend class QPainter; friend class QGLWidget; + friend class PixSetDumper; }; Only in qt-x11-free-3.3.0-snapshot-20031218.diff/src/kernel: qpixmap.h~ diff -u -r qt-x11-free-3.3.0-snapshot-20031218/src/libqt.map qt-x11-free-3.3.0-snapshot-20031218.diff/src/libqt.map --- qt-x11-free-3.3.0-snapshot-20031218/src/libqt.map 2003-12-17 20:49:49.000000000 -0500 +++ qt-x11-free-3.3.0-snapshot-20031218.diff/src/libqt.map 2003-12-30 19:49:37.000000000 -0500 @@ -2,6 +2,7 @@ global: extern "C++" { + dump_qt_pixmaps*; QString::shared_null*; TID_QUType_Null*; TID_QUType_bool*; --Boundary-00=_6HH9/SueWldIfX9 Content-Type: text/plain; charset="iso-8859-1"; name="pixmap-dump-kde.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pixmap-dump-kde.diff" Index: kdebugdcopiface.h =================================================================== RCS file: /home/kde/kdelibs/kdecore/kdebugdcopiface.h,v retrieving revision 1.2 diff -u -6 -p -r1.2 kdebugdcopiface.h --- kdebugdcopiface.h 16 Aug 2003 19:44:57 -0000 1.2 +++ kdebugdcopiface.h 1 Jan 2004 19:00:54 -0000 @@ -36,10 +36,14 @@ public: k_dcop: /** * The kdebugrc has been changed and should be reparsed now. * This will simply call kdClearDebugConfig **/ void notifyKDebugConfigChanged(); + + void forceExit(); + + void dumpPixmaps(); }; #endif Index: kdebugdcopiface.cpp =================================================================== RCS file: /home/kde/kdelibs/kdecore/kdebugdcopiface.cpp,v retrieving revision 1.1 diff -u -6 -p -r1.1 kdebugdcopiface.cpp --- kdebugdcopiface.cpp 29 Nov 2002 21:16:33 -0000 1.1 +++ kdebugdcopiface.cpp 1 Jan 2004 19:00:54 -0000 @@ -16,12 +16,13 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "kdebugdcopiface.h" #include "kdebug.h" +#include KDebugDCOPIface::KDebugDCOPIface() : DCOPObject("KDebug") { } KDebugDCOPIface::~KDebugDCOPIface() @@ -30,6 +31,17 @@ KDebugDCOPIface::~KDebugDCOPIface() void KDebugDCOPIface::notifyKDebugConfigChanged() { kdClearDebugConfig(); } +void KDebugDCOPIface::forceExit() +{ + ::exit(0); +} + +extern void dump_qt_pixmaps(); + +void KDebugDCOPIface::dumpPixmaps() +{ + dump_qt_pixmaps(); +} \ No newline at end of file --Boundary-00=_6HH9/SueWldIfX9--