From 414dd4bf127caa0729ce4ee73ce4a67bd3cd964e Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 5 Apr 2015 21:01:54 +0200 Subject: [PATCH] QErrorMessage: replace inefficient QQueue with std::queue QQueue is-a QList, so it inherits the trait that types larger than a void* cause a heap-allocation when inserted, which is horribly inefficient. Use a std::queue instead, which, by default, is backed by std::deque. Requires rewriting the API calls, since QQueue uses non-standard function names. Text and data size increase negligibly (23 and 8 bytes, respectively), even though we're instantiating a completely new type (std::deque) instead of QList>, which is probably still used, despite the inefficiency. Change-Id: I9bb04a2ec32bb1b9fa2eb83780f0aaa26e872d49 Reviewed-by: Olivier Goffart (Woboq GmbH) Reviewed-by: Thiago Macieira Reviewed-by: Friedemann Kleint --- src/widgets/dialogs/qerrormessage.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/widgets/dialogs/qerrormessage.cpp b/src/widgets/dialogs/qerrormessage.cpp index 7c185ed068..280ce4f44f 100644 --- a/src/widgets/dialogs/qerrormessage.cpp +++ b/src/widgets/dialogs/qerrormessage.cpp @@ -47,9 +47,10 @@ #include "qpixmap.h" #include "qmetaobject.h" #include "qthread.h" -#include "qqueue.h" #include "qset.h" +#include + #include #include @@ -68,7 +69,7 @@ public: QCheckBox * again; QTextEdit * errors; QLabel * icon; - QQueue > pending; + std::queue > pending; QSet doNotShow; QSet doNotShowType; QString currentMessage; @@ -305,10 +306,11 @@ QErrorMessage * QErrorMessage::qtHandler() bool QErrorMessagePrivate::nextPending() { - while (!pending.isEmpty()) { - QPair pendingMessage = pending.dequeue(); + while (!pending.empty()) { + const QPair &pendingMessage = pending.front(); QString message = pendingMessage.first; QString type = pendingMessage.second; + pending.pop(); if (!message.isEmpty() && ((type.isEmpty() && !doNotShow.contains(message)) || (!type.isEmpty() && !doNotShowType.contains(type)))) { #ifndef QT_NO_TEXTHTMLPARSER errors->setHtml(message); @@ -338,7 +340,7 @@ void QErrorMessage::showMessage(const QString &message) Q_D(QErrorMessage); if (d->doNotShow.contains(message)) return; - d->pending.enqueue(qMakePair(message,QString())); + d->pending.push(qMakePair(message,QString())); if (!isVisible() && d->nextPending()) show(); } @@ -362,7 +364,7 @@ void QErrorMessage::showMessage(const QString &message, const QString &type) Q_D(QErrorMessage); if (d->doNotShow.contains(message) && d->doNotShowType.contains(type)) return; - d->pending.push_back(qMakePair(message,type)); + d->pending.push(qMakePair(message,type)); if (!isVisible() && d->nextPending()) show(); }