[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdepim/KDE/4.9] /: Speed up asyncnepomukresourceretriever by removing linear search in vector
From:       David Faure <faure () kde ! org>
Date:       2012-06-30 15:03:30
Message-ID: 20120630150330.715EAA60A6 () git ! kde ! org
[Download RAW message or body]

Git commit 6cbf5387eafb198473d3a2e7eb08b98c11cdce8b by David Faure.
Committed on 30/06/2012 at 17:02.
Pushed by dfaure into branch 'KDE/4.9'.

Speed up asyncnepomukresourceretriever by removing linear search in vector

The QHash already had the information about pending requests.

The API had the issue that in theory a different set of properties could
be requested for an existing URL, though, but in practice this is not
happening. Moved the list of properties to the constructor, to make this
clearer (and faster, too).

Discussed with Volker.

M  +4    -4    kmail/messageactions.cpp
M  +15   -18   messagecore/asyncnepomukresourceretriever.cpp
M  +2    -2    messagecore/asyncnepomukresourceretriever.h
M  +5    -3    messagelist/core/callbacknepomukresourceretriever.cpp

http://commits.kde.org/kdepim/6cbf5387eafb198473d3a2e7eb08b98c11cdce8b

diff --git a/kmail/messageactions.cpp b/kmail/messageactions.cpp
index 7fd6706..72f685d 100644
--- a/kmail/messageactions.cpp
+++ b/kmail/messageactions.cpp
@@ -71,7 +71,7 @@ MessageActions::MessageActions( KActionCollection *ac, QWidget* \
parent ) :  mMessageView( 0 ),
     mRedirectAction( 0 ),
     mPrintPreviewAction( 0 ),
-    mAsynNepomukRetriever( new MessageCore::AsyncNepomukResourceRetriever( this ) ),
+    mAsynNepomukRetriever( new MessageCore::AsyncNepomukResourceRetriever( \
QVector<QUrl>() << Nepomuk::Resource::descriptionUri() << \
Nepomuk::Resource::annotationUri(), this ) ),  mCustomTemplatesMenu( 0 )
 {
   mReplyActionMenu = new KActionMenu( KIcon("mail-reply-sender"), \
i18nc("Message->","&Reply"), this ); @@ -313,7 +313,7 @@ void \
MessageActions::updateActions()  if ( \
Nepomuk::ResourceManager::instance()->initialized() )  {
     mAnnotateAction->setEnabled( uniqItem );
-    mAsynNepomukRetriever->requestResource( mCurrentItem.url(), QVector<QUrl>() << \
Nepomuk::Resource::descriptionUri() << Nepomuk::Resource::annotationUri() ); +    \
mAsynNepomukRetriever->requestResource( mCurrentItem.url() );  }
   else
   {
@@ -324,7 +324,7 @@ void MessageActions::updateActions()
 
   if ( mCurrentItem.hasPayload<KMime::Message::Ptr>() ) {
     if ( mCurrentItem.loadedPayloadParts().contains("RFC822") ) {
-      updateMailingListActions( mCurrentItem );      
+      updateMailingListActions( mCurrentItem );
     } else
     {
       Akonadi::ItemFetchJob *job = new Akonadi::ItemFetchJob( mCurrentItem );
@@ -635,7 +635,7 @@ void MessageActions::annotateMessage()
   MessageCore::AnnotationEditDialog *dialog = new MessageCore::AnnotationEditDialog( \
url );  dialog->setAttribute( Qt::WA_DeleteOnClose );
   if ( dialog->exec() )
-    mAsynNepomukRetriever->requestResource( url, QVector<QUrl>() << \
Nepomuk::Resource::descriptionUri() << Nepomuk::Resource::annotationUri() ); +    \
mAsynNepomukRetriever->requestResource( url );  }
 
 void MessageActions::updateAnnotateAction( const QUrl &url, const Nepomuk::Resource \
                &resource )
diff --git a/messagecore/asyncnepomukresourceretriever.cpp \
b/messagecore/asyncnepomukresourceretriever.cpp index ee1083a..a62845e 100644
--- a/messagecore/asyncnepomukresourceretriever.cpp
+++ b/messagecore/asyncnepomukresourceretriever.cpp
@@ -67,18 +67,15 @@ class AsyncNepomukResourceRetrieverPrivate
 
     void createRunnable()
     {
-      Q_ASSERT( !m_pendingRequests.isEmpty() );
+      Q_ASSERT( !m_requestedProperties.isEmpty() );
       Q_ASSERT( !m_running );
       m_running = true;
-      const QUrl url = m_pendingRequests.last();
+      const QUrl url = m_requestedProperties.begin().key();
       m_nepomukPool.start( new NepomukResourceRetrieverRunnable( url, \
m_requestedProperties.value( url ), m_parent ) );  }
 
     void removeRequest( const QUrl &url )
     {
-      const int index = m_pendingRequests.lastIndexOf( url );
-      if ( index >= 0 )
-        m_pendingRequests.remove( index );
       m_requestedProperties.remove( url );
     }
 
@@ -87,33 +84,33 @@ class AsyncNepomukResourceRetrieverPrivate
       QMutexLocker locker( &m_mutex );
       m_running = false;
       removeRequest( url );
-      if ( !m_pendingRequests.isEmpty() )
+      if ( !m_requestedProperties.isEmpty() )
         createRunnable();
       locker.unlock();
       m_parent->resourceAvailable( url, res );
     }
-    void clearRequest()
+    void clearRequests()
     {
-      Q_FOREACH(const QUrl& url, m_pendingRequests) {
-        removeRequest(url);
-      }
+      m_requestedProperties.clear();
     }
 
     AsyncNepomukResourceRetriever *m_parent;
     QThreadPool m_nepomukPool;
-    QVector<QUrl> m_pendingRequests;
-    QHash<QUrl, QVector<QUrl> > m_requestedProperties;
+    typedef QHash<QUrl, QVector<QUrl> > RequestsHash;
+    RequestsHash m_requestedProperties;
     QMutex m_mutex;
+    QVector<QUrl> m_properties;
     bool m_running;
     bool m_nepomukInitialized;
 };
 
 }
 
-AsyncNepomukResourceRetriever::AsyncNepomukResourceRetriever(QObject* parent) :
+AsyncNepomukResourceRetriever::AsyncNepomukResourceRetriever(const QVector<QUrl> \
&properties, QObject* parent) :  QObject( parent ),
   d( new AsyncNepomukResourceRetrieverPrivate( this ) )
 {
+  d->m_properties = properties;
   connect( Nepomuk::ResourceManager::instance(), SIGNAL(nepomukSystemStarted()),
            SLOT(nepomukStarted()) );
   connect( Nepomuk::ResourceManager::instance(), SIGNAL(nepomukSystemStopped()),
@@ -136,18 +133,18 @@ void AsyncNepomukResourceRetriever::nepomukStopped()
 {
   d->m_nepomukInitialized = false;
   QMutexLocker locker( &d->m_mutex );
-  d->clearRequest();
+  d->clearRequests();
 }
 
-void AsyncNepomukResourceRetriever::requestResource(const QUrl& url, const \
QVector<QUrl> &properties) +void AsyncNepomukResourceRetriever::requestResource(const \
QUrl& url)  {
   if(!d->m_nepomukInitialized)
     return;
   QMutexLocker locker( &d->m_mutex );
-  if ( d->m_pendingRequests.contains( url ) )
+  if ( d->m_requestedProperties.contains( url ) )
     return;
-  d->m_pendingRequests.push_back( url );
-  d->m_requestedProperties.insert( url, properties );
+
+  d->m_requestedProperties.insert( url, d->m_properties );
   if ( !d->m_running )
     d->createRunnable();
 }
diff --git a/messagecore/asyncnepomukresourceretriever.h \
b/messagecore/asyncnepomukresourceretriever.h index 9431465..0e51477 100644
--- a/messagecore/asyncnepomukresourceretriever.h
+++ b/messagecore/asyncnepomukresourceretriever.h
@@ -37,10 +37,10 @@ class MESSAGECORE_EXPORT AsyncNepomukResourceRetriever : public \
QObject  {
   Q_OBJECT
   public:
-    explicit AsyncNepomukResourceRetriever(QObject* parent = 0);
+    explicit AsyncNepomukResourceRetriever( const QVector<QUrl> &properties, \
QObject* parent = 0 );  ~AsyncNepomukResourceRetriever();
 
-    void requestResource( const QUrl &url, const QVector<QUrl> &properties );
+    void requestResource( const QUrl &url );
     void cancelRequest( const QUrl &url );
 
   Q_SIGNALS:
diff --git a/messagelist/core/callbacknepomukresourceretriever.cpp \
b/messagelist/core/callbacknepomukresourceretriever.cpp index 8811ab8..ded2b98 100644
--- a/messagelist/core/callbacknepomukresourceretriever.cpp
+++ b/messagelist/core/callbacknepomukresourceretriever.cpp
@@ -21,15 +21,17 @@
 
 using namespace MessageList;
 
-CallbackNepomukResourceRetriever::CallbackNepomukResourceRetriever(QObject* parent): \
AsyncNepomukResourceRetriever(parent) \
+CallbackNepomukResourceRetriever::CallbackNepomukResourceRetriever(QObject* parent) \
+  : AsyncNepomukResourceRetriever( +      QVector<QUrl>() << \
Nepomuk::Resource::tagUri() << Nepomuk::Resource::annotationUri() << \
Nepomuk::Resource::descriptionUri(), +      parent )
 {
 }
 
 void CallbackNepomukResourceRetriever::requestResource(Core::MessageItemPrivate* \
item, const QUrl& url)  {
   m_pendingCallbacks.insert( url, item );
-  AsyncNepomukResourceRetriever::requestResource( url,
-    QVector<QUrl>() << Nepomuk::Resource::tagUri() << \
Nepomuk::Resource::annotationUri() << Nepomuk::Resource::descriptionUri() ); +  \
AsyncNepomukResourceRetriever::requestResource( url );  }
 
 void CallbackNepomukResourceRetriever::cancelCallbackRequest(const QUrl& url)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic