~aacid/gsettings-qt/disconnect_signal_handler

  • Committer: Albert Astals Cid
  • Date: 2015-11-30 11:09:07 UTC
  • Revision ID: albert.astals@canonical.com-20151130110907-wt4zs3hd80344dit
Disconnect signal handler on destruction

When running unity8 under valgrind sometimes I get

==31122== Invalid read of size 8
==31122==    at 0x620DB42: QMetaObject::invokeMethod(QObject*, char const*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x1C7C63EE: invokeMethod (qobjectdefs.h:391)
==31122==    by 0x1C7C63EE: QGSettingsPrivate::settingChanged(_GSettings*, char const*, void*) (qgsettings.cpp:40)
==31122==    by 0x129DAA59: g_cclosure_marshal_VOID__STRINGv (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==    by 0x129D81D3: _g_closure_invoke_va (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==    by 0x129F29D5: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==    by 0x129F30BE: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==    by 0x138478EB: g_settings_real_change_event (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.4700.1)
==31122==    by 0x14540D8F: ffi_call_unix64 (in /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4)
==31122==    by 0x145407F7: ffi_call (in /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4)
==31122==    by 0x129D8CF4: g_cclosure_marshal_generic_va (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==    by 0x129D81D3: _g_closure_invoke_va (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==    by 0x129F24E7: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4700.1)
==31122==  Address 0x1dbaa450 is 0 bytes inside a block of size 24 free'd
==31122==    at 0x4C2D28B: operator delete(void*) (vg_replace_malloc.c:575)
==31122==    by 0x622CD2A: QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x623661F: QObject::~QObject() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x1C5BB7AD: ~QQmlElement (qqmlprivate.h:98)
==31122==    by 0x1C5BB7AD: QQmlPrivate::QQmlElement<GSettingsQml>::~QQmlElement() (qqmlprivate.h:98)
==31122==    by 0x622CD2A: QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x623661F: QObject::~QObject() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x53E886C: QQuickItem::~QQuickItem() (qquickitem.cpp:2223)
==31122==    by 0x5402DED: ~QQuickRectangle (qquickrectangle_p.h:128)
==31122==    by 0x5402DED: ~QQmlElement (qqmlprivate.h:98)
==31122==    by 0x5402DED: QQmlPrivate::QQmlElement<QQuickRectangle>::~QQmlElement() (qqmlprivate.h:98)
==31122==    by 0x622F66F: QObject::event(QEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x53E66BA: QQuickItem::event(QEvent*) (qquickitem.cpp:7302)
==31122==    by 0x61FDDE8: QCoreApplication::notify(QObject*, QEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==    by 0x61FDF1A: QCoreApplication::notifyInternal(QObject*, QEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.4.2)
==31122==  Block was alloc'd at
==31122==    at 0x4C2C12F: operator new(unsigned long) (vg_replace_malloc.c:333)
==31122==    by 0x1C5BD113: GSettingsQml::componentComplete() (gsettings-qml.cpp:141)
==31122==    by 0x5E25421: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5DB22E9: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5DB2B9E: QQmlEnginePrivate::incubate(QQmlIncubator&, QQmlContextData*) (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5DAE4EB: QQmlComponent::create(QQmlIncubator&, QQmlContext*, QQmlContext*) (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5498859: QQuickLoaderPrivate::_q_sourceLoaded() (qquickloader.cpp:713)
==31122==    by 0x54989F7: QQuickLoaderPrivate::load() (qquickloader.cpp:596)
==31122==    by 0x5E25421: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5DADEAD: QQmlComponentPrivate::complete(QQmlEnginePrivate*, QQmlComponentPrivate::ConstructionState*) (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5DADF76: QQmlComponentPrivate::completeCreate() (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)
==31122==    by 0x5DADDDF: QQmlComponent::create(QQmlContext*) (in /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5.4.2)

Which as far as i understand means that the QGSettingsPrivate::settingChanged is being called even if GSettingsQml has already been destroyed.

By disconnecting the signal handler I have not been able to reproduce the valgrind warning anymore
Filename Latest Rev Last Changed Committer Comment Size
..
.bzr-builddeb 1.1.1 10 years ago Ken VanDine added packaging and some install stuff Diff
debian 1.1.1 10 years ago Ken VanDine added packaging and some install stuff Diff
examples 18.2.7 10 years ago Lars Uebernickel Add example: using schema.choices with a qml ListV Diff
GSettings 1 10 years ago Lars Uebernickel gsettings-qt: gsettings bindings for qml Diff
src 25.1.1 10 years ago Lars Uebernickel Add libgsettings-qt, a qt/c++ library to access gs Diff
tests 5 10 years ago Lars Uebernickel Add basic testing Diff
COPYING 3.1.1 10 years ago Ken VanDine fixed headers and added COPYING file 7.4 KB Diff Download File
gsettings-qt.pro 69.1.7 8 years ago Lukáš Tinkl rename C++ test to cpptest (both target and the so 112 bytes Diff Download File