Review Request: Improve SqlMeta thread safety

Mark Kretschmann kretschmann at kde.org
Sun Oct 31 16:15:01 CET 2010


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/100098/#review231
-----------------------------------------------------------


Crash on startup:


Application: Amarok (amarok), signal: Segmentation fault
[Current thread is 1 (Thread 0x7fbdc1894780 (LWP 27264))]

Thread 13 (Thread 0x7fbd9f367710 (LWP 27265)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:212
#1  0x00007fbda5d270d1 in ?? () from /usr/lib/libxine.so.1
#2  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#3  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#4  0x0000000000000000 in ?? ()

Thread 12 (Thread 0x7fbd9eb66710 (LWP 27266)):
#0  0x00007fbdbe8fe1d3 in __poll (fds=<value optimized out>, nfds=<value optimized out>, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:87
#1  0x00007fbdb7dda009 in ?? () from /lib/libglib-2.0.so.0
#2  0x00007fbdb7dda45c in g_main_context_iteration () from /lib/libglib-2.0.so.0
#3  0x00007fbdbf2581e6 in QEventDispatcherGlib::processEvents (this=0x1edee80, flags=<value optimized out>) at kernel/qeventdispatcher_glib.cpp:417
#4  0x00007fbdbf22aa02 in QEventLoop::processEvents (this=<value optimized out>, flags=) at kernel/qeventloop.cpp:149
#5  0x00007fbdbf22adec in QEventLoop::exec (this=0x7fbd9eb65d70, flags=) at kernel/qeventloop.cpp:201
#6  0x00007fbdbf1352fd in QThread::exec (this=<value optimized out>) at thread/qthread.cpp:490
#7  0x00007fbda5f832b0 in ?? () from /usr/lib/qt4/plugins/phonon_backend/phonon_xine.so
#8  0x00007fbdbf13827e in QThreadPrivate::start (arg=0x1f96270) at thread/qthread_unix.cpp:266
#9  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#10 0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#11 0x0000000000000000 in ?? ()

Thread 11 (Thread 0x7fbd9e160710 (LWP 27267)):
#0  0x00007fbdbe8fe1d3 in __poll (fds=<value optimized out>, nfds=<value optimized out>, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:87
#1  0x00007fbdb5d7d40f in ?? () from /usr/lib/libpulse.so.0
#2  0x00007fbdb5d6cd76 in pa_mainloop_poll () from /usr/lib/libpulse.so.0
#3  0x00007fbdb5d6e7f9 in pa_mainloop_iterate () from /usr/lib/libpulse.so.0
#4  0x00007fbdb5d6e8b0 in pa_mainloop_run () from /usr/lib/libpulse.so.0
#5  0x00007fbdb5d7d20b in ?? () from /usr/lib/libpulse.so.0
#6  0x00007fbdaf569fb8 in ?? () from /usr/lib/libpulsecommon-0.9.21.so
#7  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#8  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#9  0x0000000000000000 in ?? ()

Thread 10 (Thread 0x7fbd9d95f710 (LWP 27268)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbda5d37e83 in ?? () from /usr/lib/libxine.so.1
#2  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#3  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#4  0x0000000000000000 in ?? ()

Thread 9 (Thread 0x7fbd9cd54710 (LWP 27269)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbda5d37e83 in ?? () from /usr/lib/libxine.so.1
#2  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#3  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#4  0x0000000000000000 in ?? ()

Thread 8 (Thread 0x7fbd93ffe710 (LWP 27270)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbda5d37e83 in ?? () from /usr/lib/libxine.so.1
#2  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#3  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#4  0x0000000000000000 in ?? ()

Thread 7 (Thread 0x7fbd93028710 (LWP 27272)):
#0  QEventDispatcherGlib::processEvents (this=0x1e47ba0, flags=<value optimized out>) at kernel/qeventdispatcher_glib.cpp:416
#1  0x00007fbdbf22aa02 in QEventLoop::processEvents (this=<value optimized out>, flags=) at kernel/qeventloop.cpp:149
#2  0x00007fbdbf22adec in QEventLoop::exec (this=0x7fbd93027d90, flags=) at kernel/qeventloop.cpp:201
#3  0x00007fbdbf1352fd in QThread::exec (this=<value optimized out>) at thread/qthread.cpp:490
#4  0x00007fbdbf20a5f8 in QInotifyFileSystemWatcherEngine::run (this=0x7fbd982646a0) at io/qfilesystemwatcher_inotify.cpp:248
#5  0x00007fbdbf13827e in QThreadPrivate::start (arg=0x7fbd982646a0) at thread/qthread_unix.cpp:266
#6  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#7  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#8  0x0000000000000000 in ?? ()

Thread 6 (Thread 0x7fbd870c3710 (LWP 27273)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbdbf138e3b in wait (this=<value optimized out>, mutex=0x2d94a60, time=18446744073709551615) at thread/qwaitcondition_unix.cpp:88
#2  QWaitCondition::wait (this=<value optimized out>, mutex=0x2d94a60, time=18446744073709551615) at thread/qwaitcondition_unix.cpp:160
#3  0x00007fbdbade5524 in ThreadWeaver::WeaverImpl::blockThreadUntilJobsAreBeingAssigned (this=0x2d0e640, th=0x2d830f0) at ../../../threadweaver/Weaver/WeaverImpl.cpp:365
#4  0x00007fbdbade872b in ThreadWeaver::WorkingHardState::applyForWork (this=0x2d0dbd0, th=0x2d830f0) at ../../../threadweaver/Weaver/WorkingHardState.cpp:71
#5  0x00007fbdbade6c9f in ThreadWeaver::ThreadRunHelper::run (this=0x7fbd870c2de0, parent=0x2d0e640, th=0x2d830f0) at ../../../threadweaver/Weaver/Thread.cpp:87
#6  0x00007fbdbade71f8 in ThreadWeaver::Thread::run (this=0x2d830f0) at ../../../threadweaver/Weaver/Thread.cpp:142
#7  0x00007fbdbf13827e in QThreadPrivate::start (arg=0x2d830f0) at thread/qthread_unix.cpp:266
#8  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#9  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#10 0x0000000000000000 in ?? ()

Thread 5 (Thread 0x7fbd86865710 (LWP 27274)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbdb537f20e in ?? () from /usr/lib/libQtWebKit.so.4
#2  0x00007fbdb537f329 in ?? () from /usr/lib/libQtWebKit.so.4
#3  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#4  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#5  0x0000000000000000 in ?? ()

Thread 4 (Thread 0x7fbd84d69710 (LWP 27275)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbdbf138e3b in wait (this=<value optimized out>, mutex=0x2d94a60, time=18446744073709551615) at thread/qwaitcondition_unix.cpp:88
#2  QWaitCondition::wait (this=<value optimized out>, mutex=0x2d94a60, time=18446744073709551615) at thread/qwaitcondition_unix.cpp:160
#3  0x00007fbdbade5524 in ThreadWeaver::WeaverImpl::blockThreadUntilJobsAreBeingAssigned (this=0x2d0e640, th=0x2e3b9e0) at ../../../threadweaver/Weaver/WeaverImpl.cpp:365
#4  0x00007fbdbade872b in ThreadWeaver::WorkingHardState::applyForWork (this=0x2d0dbd0, th=0x2e3b9e0) at ../../../threadweaver/Weaver/WorkingHardState.cpp:71
#5  0x00007fbdbade6c9f in ThreadWeaver::ThreadRunHelper::run (this=0x7fbd84d68de0, parent=0x2d0e640, th=0x2e3b9e0) at ../../../threadweaver/Weaver/Thread.cpp:87
#6  0x00007fbdbade71f8 in ThreadWeaver::Thread::run (this=0x2e3b9e0) at ../../../threadweaver/Weaver/Thread.cpp:142
#7  0x00007fbdbf13827e in QThreadPrivate::start (arg=0x2e3b9e0) at thread/qthread_unix.cpp:266
#8  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#9  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#10 0x0000000000000000 in ?? ()

Thread 3 (Thread 0x7fbd7f7d6710 (LWP 27276)):
#0  0x00007fbdbe9032b3 in select () at ../sysdeps/unix/syscall-template.S:82
#1  0x00007fbda5d50385 in xine_usec_sleep () from /usr/lib/libxine.so.1
#2  0x00007fbda5d34d09 in ?? () from /usr/lib/libxine.so.1
#3  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#4  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#5  0x0000000000000000 in ?? ()

Thread 2 (Thread 0x7fbd7b1ee710 (LWP 27277)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00007fbdba625334 in QTWTF::TCMalloc_PageHeap::scavengerThread (this=0x7fbdba930160) at ../3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp:2359
#2  0x00007fbdba625369 in QTWTF::TCMalloc_PageHeap::runScavengerThread (context=0x7fbdba93e234) at ../3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp:1464
#3  0x00007fbdbc401971 in start_thread (arg=<value optimized out>) at pthread_create.c:304
#4  0x00007fbdbe90a91d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#5  0x0000000000000000 in ?? ()

Thread 1 (Thread 0x7fbdc1894780 (LWP 27264)):
[KCrash Handler]
#6  QSortFilterProxyModelPrivate::proxy_to_source (this=0x2566aa0, proxy_index=...) at itemviews/qsortfilterproxymodel.cpp:369
#7  0x00007fbdc01c861d in QSortFilterProxyModel::mapToSource (this=<value optimized out>, proxyIndex=...) at itemviews/qsortfilterproxymodel.cpp:2491
#8  0x00007fbdc01beb96 in QSortFilterProxyModel::data (this=0x2566aa0, index=..., role=0) at itemviews/qsortfilterproxymodel.cpp:1712
#9  0x00007fbdc0a0bb1b in Playlist::GroupingProxy::data (this=0x25665f0, index=..., role=32) at /home/mark/kde/src/amarok/src/playlist/proxymodels/GroupingProxy.cpp:194
#10 0x00007fbdc08d523b in QModelIndex::data (this=0x37d9060, arole=32) at /usr/include/qt4/QtCore/qabstractitemmodel.h:398
#11 0x00007fbdc09acb1a in Playlist::PlaylistLayout::partForItem (this=0x7fff395a5b00, index=...) at /home/mark/kde/src/amarok/src/playlist/layouts/LayoutItemConfig.cpp:173
#12 0x00007fbdc09f5684 in Playlist::PlaylistLayout::layoutForItem (this=0x7fff395a5b00, index=...) at /home/mark/kde/src/amarok/src/playlist/layouts/LayoutItemConfig.h:261
#13 0x00007fbdc09f86df in Playlist::PrettyItemDelegate::paint (this=0x2c23400, painter=0x7fff395a6050, option=..., index=...) at /home/mark/kde/src/amarok/src/playlist/view/listview/PrettyItemDelegate.cpp:193
#14 0x00007fbdc015b83a in QListView::paintEvent (this=<value optimized out>, e=<value optimized out>) at itemviews/qlistview.cpp:1044
#15 0x00007fbdc0a036f7 in Playlist::PrettyListView::paintEvent (this=0x2c1dba0, event=0x7fff395a6d30) at /home/mark/kde/src/amarok/src/playlist/view/listview/PrettyListView.cpp:631
#16 0x00007fbdbfc37c2e in QWidget::event (this=0x2c1dba0, event=0x7fff395a6d30) at kernel/qwidget.cpp:8333
#17 0x00007fbdc00035e6 in QFrame::event (this=0x2c1dba0, e=0x7fff395a6d30) at widgets/qframe.cpp:557
#18 0x00007fbdc013ca8b in QAbstractItemView::viewportEvent (this=0x2c1dba0, event=0x7fff395a6d30) at itemviews/qabstractitemview.cpp:1619
#19 0x00007fbdbf22b507 in QCoreApplicationPrivate::sendThroughObjectEventFilters (this=<value optimized out>, receiver=0x2c1bab0, event=0x7fff395a6d30) at kernel/qcoreapplication.cpp:847
#20 0x00007fbdbfbe1fac in QApplicationPrivate::notify_helper (this=0x1d7b190, receiver=0x2c1bab0, e=0x7fff395a6d30) at kernel/qapplication.cpp:4392
#21 0x00007fbdbfbe7aed in QApplication::notify (this=0x7fff395a9920, receiver=0x2c1bab0, e=0x7fff395a6d30) at kernel/qapplication.cpp:4277
#22 0x00007fbdc13ab4d6 in KApplication::notify (this=0x7fff395a9920, receiver=0x2c1bab0, event=0x7fff395a6d30) at ../../kdeui/kernel/kapplication.cpp:310
#23 0x00007fbdbf22bcdc in QCoreApplication::notifyInternal (this=0x7fff395a9920, receiver=0x2c1bab0, event=0x7fff395a6d30) at kernel/qcoreapplication.cpp:732
#24 0x00007fbdbfc3e67d in sendSpontaneousEvent (this=0x2c1e080, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:218
#25 QWidgetPrivate::drawWidget (this=0x2c1e080, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5420
#26 0x00007fbdbfc3f328 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=0, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5627
#27 0x00007fbdbfc3e3da in QWidgetPrivate::drawWidget (this=0x2c1dc40, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5473
#28 0x00007fbdbfc3f328 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=1, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5627
#29 0x00007fbdbfc3e3da in QWidgetPrivate::drawWidget (this=0x2c1d7b0, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5473
#30 0x00007fbdbfc3f328 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=5, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5627
#31 0x00007fbdbfc3f159 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=6, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5614
#32 0x00007fbdbfc3e3da in QWidgetPrivate::drawWidget (this=0x2a59ca0, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5473
#33 0x00007fbdbfc3f328 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=7, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5627
#34 0x00007fbdbfc3e3da in QWidgetPrivate::drawWidget (this=0x2a5b210, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5473
#35 0x00007fbdbfc3f328 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=84, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5627
#36 0x00007fbdbfc3f159 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=85, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5614
#37 0x00007fbdbfc3f159 in QWidgetPrivate::paintSiblingsRecursive (this=<value optimized out>, pdev=<value optimized out>, siblings=..., index=86, rgn=<value optimized out>, offset=<value optimized out>, flags=4, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5614
#38 0x00007fbdbfc3e3da in QWidgetPrivate::drawWidget (this=0x1d786a0, pdev=<value optimized out>, rgn=..., offset=<value optimized out>, flags=<value optimized out>, sharedPainter=0x0, backingStore=0x2b9ec80) at kernel/qwidget.cpp:5473
#39 0x00007fbdbfe12408 in QWidgetBackingStore::sync (this=0x2b9ec80) at painting/qbackingstore.cpp:1328
#40 0x00007fbdbfe12769 in QWidgetBackingStore::sync (this=0x2b9ec80, exposedWidget=0x2a6a3a0, exposedRegion=...) at painting/qbackingstore.cpp:1130
#41 0x00007fbdbfc5c4da in QETWidget::translatePaintEvent (this=0x2a6a3a0, event=<value optimized out>) at kernel/qapplication_x11.cpp:5117
#42 0x00007fbdbfc6904b in QApplication::x11ProcessEvent (this=<value optimized out>, event=0x7fff395a9590) at kernel/qapplication_x11.cpp:3436
#43 0x00007fbdbfc950e2 in x11EventSourceDispatch (s=0x1d83a00, callback=<value optimized out>, user_data=<value optimized out>) at kernel/qguieventdispatcher_glib.cpp:146
#44 0x00007fbdb7dd6342 in g_main_context_dispatch () from /lib/libglib-2.0.so.0
#45 0x00007fbdb7dda2a8 in ?? () from /lib/libglib-2.0.so.0
#46 0x00007fbdb7dda45c in g_main_context_iteration () from /lib/libglib-2.0.so.0
#47 0x00007fbdbf258193 in QEventDispatcherGlib::processEvents (this=0x1c24f90, flags=<value optimized out>) at kernel/qeventdispatcher_glib.cpp:415
#48 0x00007fbdbfc94a4e in QGuiEventDispatcherGlib::processEvents (this=0x2, flags=<value optimized out>) at kernel/qguieventdispatcher_glib.cpp:204
#49 0x00007fbdbf22aa02 in QEventLoop::processEvents (this=<value optimized out>, flags=) at kernel/qeventloop.cpp:149
#50 0x00007fbdbf22adec in QEventLoop::exec (this=0x7fff395a98c0, flags=) at kernel/qeventloop.cpp:201
#51 0x00007fbdbf22eebb in QCoreApplication::exec () at kernel/qcoreapplication.cpp:1009
#52 0x000000000040aeb3 in main (argc=4, argv=0x7fff395ab888) at /home/mark/kde/src/amarok/src/main.cpp:237

- Mark


On 2010-10-30 14:15:21, Ralf Engels wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/100098/
> -----------------------------------------------------------
> 
> (Updated 2010-10-30 14:15:21)
> 
> 
> Review request for Amarok.
> 
> 
> Summary
> -------
> 
> This patch improves the SqlMeta thread safety.
> It has several parts:
> - Use QReadWriteLock for SqlTrack.
>  For this I also needed to pull the read accessor functions into the .cpp
> - SqlCollection is a const pointer.
>  All metas are directly dependent on the SqlCollection and it could and should never change.
>  Using weak pointers here is not needed.
>  Note that now the access to m_collection is also thread safe as it's const
> - SqlAlbum::setCompilation did modify the old album
>  This was changed an a new album will be created.
>  The positive side effect is that the UI will now update directly if setting a compilation
> - SqlAlbum::setImage will now copy embedded images directly when set
>  If the track-uid is set (maybe from another thread) the cover image will still be found.
>  Note that the image cache is and was not connected to the track uid.
> 
> 
> This addresses bug 254631.
>     https://bugs.kde.org/show_bug.cgi?id=254631
> 
> 
> Diffs
> -----
> 
>   src/core-impl/collections/sqlcollection/CapabilityDelegateImpl.cpp 0e3578a 
>   src/core-impl/collections/sqlcollection/SqlCollection.cpp b88d257 
>   src/core-impl/collections/sqlcollection/SqlMeta.h cc680ec 
>   src/core-impl/collections/sqlcollection/SqlMeta.cpp 7a210d3 
>   src/core-impl/collections/sqlcollection/SqlRegistry.h 66ba632 
>   src/core-impl/collections/sqlcollection/SqlRegistry.cpp e1b3571 
>   tests/core-impl/collections/sqlcollection/TestSqlArtist.cpp 270874b 
> 
> Diff: http://git.reviewboard.kde.org/r/100098/diff
> 
> 
> Testing
> -------
> 
> setting and unsetting compilation
> changing album name
> scanning and fully scanning collection
> 
> 
> Thanks,
> 
> Ralf
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.kde.org/pipermail/amarok-devel/attachments/20101031/3367f759/attachment-0001.htm 


More information about the Amarok-devel mailing list