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

List:       kde-pim
Subject:    [Kde-pim] KDE/kdepim/kresources/akonadi/kabc
From:       Kevin Krammer <kevin.krammer () gmx ! at>
Date:       2009-02-03 19:21:08
Message-ID: 1233688868.948556.1925.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 920776 by krake:

Implement synchronous operations during load using QtConcurrent for blocking instead \
of nested event loops. The other approach resulted in weird errors in applications \
not expecting this kind of reentrancy.

If this doesn't lead to any regressions, I'll backport it to 4.2
Please help testing!

CCMAIL: kde-pim@kde.org


 M  +67 -19    resourceakonadi.cpp  


--- trunk/KDE/kdepim/kresources/akonadi/kabc/resourceakonadi.cpp #920775:920776
@@ -1,7 +1,7 @@
 // -*- c-basic-offset: 2 -*-
 /*
     This file is part of libkabc.
-    Copyright (c) 2008 Kevin Krammer <kevin.krammer@gmx.at>
+    Copyright (c) 2008-2009 Kevin Krammer <kevin.krammer@gmx.at>
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -40,11 +40,56 @@
 #include <kconfiggroup.h>
 #include <kdebug.h>
 
+#include <QtConcurrentRun>
+#include <QFuture>
 #include <QHash>
 
 using namespace Akonadi;
 using namespace KABC;
 
+class ThreadJobContext
+{
+  public:
+    void clear()
+    {
+      mJobError.clear();
+      mCollections.clear();
+      mItems.clear();
+    }
+
+    bool fetchCollections()
+    {
+      CollectionFetchJob *job = new CollectionFetchJob( Collection::root(), \
CollectionFetchJob::Recursive ); +      if ( job->exec() ) {
+        mCollections = job->collections();
+        return true;
+      }
+
+      mJobError = job->errorString();
+      return false;
+    }
+
+    bool fetchItems( const Collection &collection )
+    {
+      ItemFetchJob *job = new ItemFetchJob( collection );
+      job->fetchScope().fetchFullPayload();
+
+      if ( job->exec() ) {
+        mItems = job->items();
+        return true;
+      }
+
+      mJobError = job->errorString();
+      return false;
+    }
+
+  public:
+    QString mJobError;
+
+    Collection::List mCollections;
+    Item::List mItems;
+};
+
 typedef QMap<Item::Id, Item> ItemMap;
 typedef QHash<QString, Item::Id> IdHash;
 
@@ -157,6 +202,8 @@
 
     QSet<QString> mAsyncLoadCollections;
 
+    ThreadJobContext mThreadJobContext;
+
   public:
     void subResourceLoadResult( KJob *job );
 
@@ -343,15 +390,15 @@
 
   // if we do not have any collection yet, fetch them explicitly
   if ( collections.isEmpty() ) {
-    CollectionFetchJob *colJob =
-      new CollectionFetchJob( Collection::root(), CollectionFetchJob::Recursive );
-    if ( !colJob->exec() ) {
-      emit loadingError( this, colJob->errorString() );
+    d->mThreadJobContext.clear();
+    QFuture<bool> threadResult =
+      QtConcurrent::run( &(d->mThreadJobContext), \
&ThreadJobContext::fetchCollections ); +    if ( !threadResult.result() ) {
+      emit loadingError( this, d->mThreadJobContext.mJobError );
       return false;
     }
 
-    // TODO: should probably add the data to the model right here
-    collections = colJob->collections();
+    collections = d->mThreadJobContext.mCollections;
   }
 
   bool result = true;
@@ -404,14 +451,15 @@
 
   // if we do not have any collection yet, fetch them explicitly
   if ( collections.isEmpty() ) {
-    CollectionFetchJob *colJob =
-      new CollectionFetchJob( Collection::root(), CollectionFetchJob::Recursive );
-    if ( !colJob->exec() ) {
-      emit loadingError( this, colJob->errorString() );
+    d->mThreadJobContext.clear();
+    QFuture<bool> threadResult =
+      QtConcurrent::run( &(d->mThreadJobContext), \
&ThreadJobContext::fetchCollections ); +    if ( !threadResult.result() ) {
+      emit loadingError( this, d->mThreadJobContext.mJobError );
       return false;
     }
 
-    foreach ( const Collection &collection, colJob->collections() ) {
+    foreach ( const Collection &collection, d->mThreadJobContext.mCollections ) {
       if ( !collection.contentMimeTypes().contains( QLatin1String( "text/directory" \
                ) )
             && !collection.contentMimeTypes().contains( ContactGroup::mimeType() ) )
         continue;
@@ -1383,18 +1431,18 @@
 bool ResourceAkonadi::Private::reloadSubResource( SubResource *subResource, bool \
&changed )  {
   changed = false;
-  ItemFetchJob *job = new ItemFetchJob( subResource->mCollection );
-  job->fetchScope().fetchFullPayload();
-
-  if ( !job->exec() ) {
-    emit mParent->loadingError( mParent, job->errorString() );
+  mThreadJobContext.clear();
+  QFuture<bool> threadResult =
+    QtConcurrent::run( &mThreadJobContext, &ThreadJobContext::fetchItems, \
subResource->mCollection ); +  if ( !threadResult.result() ) {
+    emit mParent->loadingError( mParent, mThreadJobContext.mJobError );
     return false;
   }
 
+  Item::List items = mThreadJobContext.mItems;
+
   const QString collectionUrl = subResource->mCollection.url().url();
 
-  Item::List items = job->items();
-
   kDebug(5700) << "Reload for sub resource " << collectionUrl
                << "produced" << items.count() << "items";
 
_______________________________________________
KDE PIM mailing list kde-pim@kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/


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

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