[SCM] qtbase packaging branch, ubuntu, updated. ubuntu/5.5.1+dfsg-13ubuntu2-18-g0839be2
Timo Jyrinki
timo at moszumanska.debian.org
Fri Feb 26 07:02:27 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/qt/qtbase.git;a=commitdiff;h=592183b
The following commit has been merged in the ubuntu branch:
commit 592183b280146c81c722ac923d231fe974c7c4e0
Author: Timo Jyrinki <timo.jyrinki at canonical.com>
Date: Fri Feb 26 07:00:11 2016 +0000
Remove fix for deferredDelete, not working.
---
debian/changelog | 2 -
...erredDelete-bug-when-calling-the-glib-loo.patch | 330 ---------------------
2 files changed, 332 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 03f9f3d..1725be3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,8 +2,6 @@ qtbase-opensource-src (5.5.1+dfsg-14ubuntu2) UNRELEASED; urgency=medium
* debian/patches/enable-tests.patch: some qnetworkcookiejar tests have
started failing without any Qt changes (LP: #1548686)
- * debian/patches/Fix-for-deferredDelete-bug-when-calling-the-glib-loo.patch:
- - Fix DeferredDelete events handling. (LP: #1460970)
* xcb-Use-a-placeholder-QScreen-when-there-are-no-outp.patch:
- Another multi-monitor crasher fix (LP: #1548766)
* Rebase the xcb-Use-a-placeholder-QScreen-when-there-are-no-outp.patch to
diff --git a/debian/patches/Fix-for-deferredDelete-bug-when-calling-the-glib-loo.patch b/debian/patches/Fix-for-deferredDelete-bug-when-calling-the-glib-loo.patch
deleted file mode 100644
index 48f3283..0000000
--- a/debian/patches/Fix-for-deferredDelete-bug-when-calling-the-glib-loo.patch
+++ /dev/null
@@ -1,330 +0,0 @@
-From c5d49725779292a04fed599eb7f508d334ffc5c3 Mon Sep 17 00:00:00 2001
-From: Paolo Angelelli <paolo.angelelli at theqtcompany.com>
-Date: Thu, 3 Dec 2015 10:57:55 +0100
-Subject: [PATCH] Fix for deferredDelete() bug when calling the glib loop
- directly
-
-This patch makes sure that all events posted using Qt on top of the
-GLib event loop have the loopLevel counter incremented.
-This is done since Qt depends on the fact that all deleteLater() calls
-are issued within the scope of some signal handler (in other words,
-triggered by the chain sendEvent() -> notifyInternal2()).
-There is a side effect though: in the conditions affected by this
-patch, that is deleteLater()s issued within a glib event handler for
-example, manually calling processEvents() or sendPostedEvents() with
-or without the QEvent::DeferredDelete flag has the same effect, and
-deferred deleted events are always processed.
-While this is not a currently working feature which the patch breaks,
-this side effect seems to be difficult to avoid without separating
-sendPostedEvents() and processEvents() into a public and a private
-method, in order to detect when they are manually called.
-Such change could perhaps be done for Qt6.
-An autotest for QTBUG-36434 is also included.
-Autotesting for QTBUG-32859 seems to be more challenging in this
-respect, due to its dependency on GLib.
-
-Task-number: QTBUG-18434
-Task-number: QTBUG-32859
-Task-number: QTBUG-36434
-Change-Id: Ib89175aa27c9e38bca68ae254d182b2cd21cf7e9
-Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart at woboq.com>
----
- src/corelib/kernel/qabstracteventdispatcher.cpp | 2 +-
- src/corelib/kernel/qcoreapplication.cpp | 46 ++++++++---
- src/corelib/thread/qthread.cpp | 2 +-
- src/corelib/thread/qthread_p.h | 11 +--
- src/plugins/platforms/cocoa/qcocoamenu.mm | 2 +-
- src/plugins/platforms/cocoa/qcocoamenuloader.mm | 2 +-
- tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 97 +++++++++++++++++++++++
- 7 files changed, 143 insertions(+), 19 deletions(-)
-
-diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
-index 31369f9..907b3cc 100644
---- a/src/corelib/kernel/qabstracteventdispatcher.cpp
-+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
-@@ -458,7 +458,7 @@ bool QAbstractEventDispatcher::filterNativeEvent(const QByteArray &eventType, vo
- if (!d->eventFilters.isEmpty()) {
- // Raise the loopLevel so that deleteLater() calls in or triggered
- // by event_filter() will be processed from the main event loop.
-- QScopedLoopLevelCounter loopLevelCounter(d->threadData);
-+ QScopedScopeLevelCounter scopeLevelCounter(d->threadData);
- for (int i = 0; i < d->eventFilters.size(); ++i) {
- QAbstractNativeEventFilter *filter = d->eventFilters.at(i);
- if (!filter)
-diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
-index 60f3dc0..42bda25 100644
---- a/src/corelib/kernel/qcoreapplication.cpp
-+++ b/src/corelib/kernel/qcoreapplication.cpp
-@@ -980,7 +980,7 @@ bool QCoreApplication::notifyInternal2(QObject *receiver, QEvent *event)
- // call overhead.
- QObjectPrivate *d = receiver->d_func();
- QThreadData *threadData = d->threadData;
-- QScopedLoopLevelCounter loopLevelCounter(threadData);
-+ QScopedScopeLevelCounter scopeLevelCounter(threadData);
- return notify(receiver, event);
- }
-
-@@ -1193,6 +1193,9 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags)
- */
- void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int maxtime)
- {
-+ // ### Qt 6: consider splitting this method into a public and a private
-+ // one, so that a user-invoked processEvents can be detected
-+ // and handled properly.
- QThreadData *data = QThreadData::current();
- if (!data->hasEventDispatcher())
- return;
-@@ -1396,8 +1399,24 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
-
- if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) {
- // remember the current running eventloop for DeferredDelete
-- // events posted in the receiver's thread
-- static_cast<QDeferredDeleteEvent *>(event)->level = data->loopLevel;
-+ // events posted in the receiver's thread.
-+
-+ // Events sent by non-Qt event handlers (such as glib) may not
-+ // have the scopeLevel set correctly. The scope level makes sure that
-+ // code like this:
-+ // foo->deleteLater();
-+ // qApp->processEvents(); // without passing QEvent::DeferredDelete
-+ // will not cause "foo" to be deleted before returning to the event loop.
-+
-+ // If the scope level is 0 while loopLevel != 0, we are called from a
-+ // non-conformant code path, and our best guess is that the scope level
-+ // should be 1. (Loop level 0 is special: it means that no event loops
-+ // are running.)
-+ int loopLevel = data->loopLevel;
-+ int scopeLevel = data->scopeLevel;
-+ if (scopeLevel == 0 && loopLevel != 0)
-+ scopeLevel = 1;
-+ static_cast<QDeferredDeleteEvent *>(event)->level = loopLevel + scopeLevel;
- }
-
- // delete the event on exceptions to protect against memory leaks till the event is
-@@ -1474,6 +1493,9 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven
- */
- void QCoreApplication::sendPostedEvents(QObject *receiver, int event_type)
- {
-+ // ### Qt 6: consider splitting this method into a public and a private
-+ // one, so that a user-invoked sendPostedEvents can be detected
-+ // and handled properly.
- QThreadData *data = QThreadData::current();
-
- QCoreApplicationPrivate::sendPostedEvents(receiver, event_type, data);
-@@ -1565,15 +1587,19 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
- }
-
- if (pe.event->type() == QEvent::DeferredDelete) {
-- // DeferredDelete events are only sent when we are explicitly asked to
-- // (s.a. QEvent::DeferredDelete), and then only if the event loop that
-- // posted the event has returned.
-- int loopLevel = static_cast<QDeferredDeleteEvent *>(pe.event)->loopLevel();
-+ // DeferredDelete events are sent either
-+ // 1) when the event loop that posted the event has returned; or
-+ // 2) if explicitly requested (with QEvent::DeferredDelete) for
-+ // events posted by the current event loop; or
-+ // 3) if the event was posted before the outermost event loop.
-+
-+ int eventLevel = static_cast<QDeferredDeleteEvent *>(pe.event)->loopLevel();
-+ int loopLevel = data->loopLevel + data->scopeLevel;
- const bool allowDeferredDelete =
-- (loopLevel > data->loopLevel
-- || (!loopLevel && data->loopLevel > 0)
-+ (eventLevel > loopLevel
-+ || (!eventLevel && loopLevel > 0)
- || (event_type == QEvent::DeferredDelete
-- && loopLevel == data->loopLevel));
-+ && eventLevel == loopLevel));
- if (!allowDeferredDelete) {
- // cannot send deferred delete
- if (!event_type && !receiver) {
-diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
-index 14209d8..69f8d72 100644
---- a/src/corelib/thread/qthread.cpp
-+++ b/src/corelib/thread/qthread.cpp
-@@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE
- */
-
- QThreadData::QThreadData(int initialRefCount)
-- : _ref(initialRefCount), loopLevel(0), thread(0), threadId(0),
-+ : _ref(initialRefCount), loopLevel(0), scopeLevel(0), thread(0), threadId(0),
- eventDispatcher(0), quitNow(false), canWait(true), isAdopted(false)
- {
- // fprintf(stderr, "QThreadData %p created
", this);
-diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
-index 39a41f1..5f7d01f 100644
---- a/src/corelib/thread/qthread_p.h
-+++ b/src/corelib/thread/qthread_p.h
-@@ -280,6 +280,7 @@ private:
-
- public:
- int loopLevel;
-+ int scopeLevel;
-
- QStack<QEventLoop *> eventLoops;
- QPostEventList postEventList;
-@@ -295,15 +296,15 @@ public:
- bool isAdopted;
- };
-
--class QScopedLoopLevelCounter
-+class QScopedScopeLevelCounter
- {
- QThreadData *threadData;
- public:
-- inline QScopedLoopLevelCounter(QThreadData *threadData)
-+ inline QScopedScopeLevelCounter(QThreadData *threadData)
- : threadData(threadData)
-- { ++threadData->loopLevel; }
-- inline ~QScopedLoopLevelCounter()
-- { --threadData->loopLevel; }
-+ { ++threadData->scopeLevel; }
-+ inline ~QScopedScopeLevelCounter()
-+ { --threadData->scopeLevel; }
- };
-
- // thread wrapper for the main() thread
-diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
-index 8091ba8..8c576c7 100644
---- a/src/plugins/platforms/cocoa/qcocoamenu.mm
-+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
-@@ -128,7 +128,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QCocoaMenuDelegate);
- - (void) itemFired:(NSMenuItem*) item
- {
- QCocoaMenuItem *cocoaItem = reinterpret_cast<QCocoaMenuItem *>([item tag]);
-- QScopedLoopLevelCounter loopLevelCounter(QGuiApplicationPrivate::instance()->threadData);
-+ QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData);
- QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers:[NSEvent modifierFlags]];
- static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated);
- activatedSignal.invoke(cocoaItem, Qt::QueuedConnection);
-diff --git a/src/plugins/platforms/cocoa/qcocoamenuloader.mm b/src/plugins/platforms/cocoa/qcocoamenuloader.mm
-index d73b9a8..e440a90 100644
---- a/src/plugins/platforms/cocoa/qcocoamenuloader.mm
-+++ b/src/plugins/platforms/cocoa/qcocoamenuloader.mm
-@@ -308,7 +308,7 @@ QT_END_NAMESPACE
-
- if ([item tag]) {
- QCocoaMenuItem *cocoaItem = reinterpret_cast<QCocoaMenuItem *>([item tag]);
-- QScopedLoopLevelCounter loopLevelCounter(QGuiApplicationPrivate::instance()->threadData);
-+ QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData);
- cocoaItem->activated();
- }
- }
-diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
-index 0f45ba4..540284f 100644
---- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
-+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
-@@ -142,6 +142,7 @@ private slots:
- void qmlConnect();
- void exceptions();
- void noDeclarativeParentChangedOnDestruction();
-+ void deleteLaterInAboutToBlockHandler();
- };
-
- struct QObjectCreatedOnShutdown
-@@ -5789,6 +5790,102 @@ void tst_QObject::connectFunctorWithContext()
- context->deleteLater();
- }
-
-+class StatusChanger : public QObject
-+{
-+ Q_OBJECT
-+public:
-+ StatusChanger(int *status) : m_status(status)
-+ {
-+ }
-+ ~StatusChanger()
-+ {
-+ *m_status = 2;
-+ }
-+private:
-+ int *m_status;
-+};
-+
-+class DispatcherWatcher : public QObject
-+{
-+ Q_OBJECT
-+public:
-+ DispatcherWatcher(QEventLoop &e, int *statusAwake, int *statusAboutToBlock) :
-+ m_statusAboutToBlock(statusAboutToBlock),
-+ m_statusAwake(statusAwake),
-+ m_eventLoop(&e),
-+ m_aboutToBlocks(0),
-+ m_awakes(0)
-+ {
-+ awake = new StatusChanger(statusAwake);
-+ abouttoblock = new StatusChanger(statusAboutToBlock);
-+ QCOMPARE(*statusAwake, 1);
-+ QCOMPARE(*statusAboutToBlock, 1);
-+ connect(QAbstractEventDispatcher::instance(), SIGNAL(awake()), this, SLOT(onAwake()));
-+ connect(QAbstractEventDispatcher::instance(), SIGNAL(aboutToBlock()), this, SLOT(onAboutToBlock()));
-+
-+ }
-+
-+ ~DispatcherWatcher()
-+ {
-+ if (awake)
-+ awake->deleteLater();
-+ if (abouttoblock)
-+ abouttoblock->deleteLater();
-+ }
-+
-+public slots:
-+ // The order of these 2 handlers differs on different event dispatchers
-+ void onAboutToBlock()
-+ {
-+ if (abouttoblock) {
-+ abouttoblock->deleteLater();
-+ abouttoblock = 0;
-+ }
-+ ++m_aboutToBlocks;
-+ }
-+ void onAwake()
-+ {
-+ if (awake) {
-+ awake->deleteLater();
-+ awake = 0;
-+ }
-+ ++m_awakes;
-+
-+ }
-+ void onSignal1()
-+ {
-+ // Status check. At this point the event loop should have spinned enough to delete all the objects.
-+ QCOMPARE(*m_statusAwake, 2);
-+ QCOMPARE(*m_statusAboutToBlock, 2);
-+ QMetaObject::invokeMethod(m_eventLoop, "quit", Qt::QueuedConnection);
-+ }
-+
-+private:
-+ StatusChanger *awake;
-+ StatusChanger *abouttoblock;
-+ QEventLoop *m_eventLoop;
-+ int *m_statusAwake;
-+ int *m_statusAboutToBlock;
-+ int m_aboutToBlocks;
-+ int m_awakes;
-+};
-+
-+
-+void tst_QObject::deleteLaterInAboutToBlockHandler()
-+{
-+ int statusAwake = 1;
-+ int statusAboutToBlock = 1;
-+ QEventLoop e;
-+ DispatcherWatcher dw(e, &statusAwake, &statusAboutToBlock);
-+ QTimer::singleShot(2000, &dw, &DispatcherWatcher::onSignal1);
-+
-+ QCOMPARE(statusAwake, 1);
-+ QCOMPARE(statusAboutToBlock, 1);
-+ e.exec();
-+ QCOMPARE(statusAwake, 2);
-+ QCOMPARE(statusAboutToBlock, 2);
-+}
-+
- class MyFunctor
- {
- public:
---
-2.7.0
-
--
qtbase packaging
More information about the pkg-kde-commits
mailing list