Killability of ImportProjectJob

Olivier JG olivier.jg at gmail.com
Fri Dec 17 04:09:44 UTC 2010


On 12/17/2010 11:39 AM, Aleix Pol wrote:
> On Fri, Dec 17, 2010 at 4:12 AM, Olivier JG <olivier.jg at gmail.com 
> <mailto:olivier.jg at gmail.com>> wrote:
>
>     On 11/21/2010 01:00 AM, Milian Wolff wrote:
>
>         On Saturday 20 November 2010 17:50:31 Milian Wolff wrote:
>
>             Hey all,
>
>             currently the ImportProjectJob is not really
>             interruptable. It has doKill
>             that just waitForFinished which can easily lead to
>             deadlocks nowadays,
>             since we can import stuff from the background bug
>             QMetaType::invokeMethod
>             in the projectmodel then. E.g.:
>
>         btw, I just notice that this is probably only hit when I try
>         this patch:
>
>         diff --git a/shell/project.cpp b/shell/project.cpp
>         index c8fbc53..877c4a9 100644
>         --- a/shell/project.cpp
>         +++ b/shell/project.cpp
>         @@ -237,9 +237,10 @@ public:
>
>                  loading=false;
>                  if(job->errorText().isEmpty()) {
>         -            projCtrl->projectModel()->appendRow(topItem);
>                      projCtrl->projectImportingFinished( project );
>                  } else {
>         +            Q_ASSERT(topItem->index().isValid());
>         +            projCtrl->projectModel()->removeRow(topItem->row());
>                      projCtrl->closeProject(project);
>                  }
>              }
>         @@ -516,6 +517,7 @@ bool Project::open( const KUrl&
>          projectFileUrl_ )
>              d->loadVersionControlPlugin(projectGroup);
>              d->progress->setBuzzy();
>              KJob* importJob = iface->createImportJob(d->topItem );
>         +  
>          Core::self()->projectController()->projectModel()->appendRow(d->topItem);
>              connect( importJob, SIGNAL( result( KJob* ) ), this,
>         SLOT( importDone(
>         KJob* ) ) );
>              Core::self()->runController()->registerJob( importJob );
>              return true;
>
>         Which would be an (imo) awesome addition to KDevelop. It
>         didn't used to work
>         as items where added from random threads but now that they are
>         always added
>         from the UI it just works™
>
>
>     As I noted here: https://bugs.kde.org/show_bug.cgi?id=256709 it
>     seems that the ImportProjectJob cannot be canceled because it is
>     run with QtConcurrent::run(), which the documentation states
>     doesn't support being canceled. All you can do is wait for it to
>     finish.
>     Until such a time as someone rewrites ProjectImportJob to support
>     killing, shouldn't the ImportProjectJob simply not advertise
>     itself as Killable?
>
>     (As a side note, when I remove the call to
>     setCapabilities(killable), the stop button still gets enabled, but
>     simply doesn't do anything...)
>
>     -Olivier JG
>
>     -- 
>     KDevelop-devel mailing list
>     KDevelop-devel at kdevelop.org <mailto:KDevelop-devel at kdevelop.org>
>     https://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-devel
>
>
> Right now what we're doing is that if it's cancelled the process is 
> told to be finished ASAP. If the project is using the "QList 
> ::parse()" method properly it will stop reading further in the tree 
> and close the project.
>
> Aleix

Sure, but from what I can tell, it's never cancelled, because that's not 
supported for something started with QtConcurrent::run().
-Olivier JG

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20101217/2f0b84da/attachment.html>


More information about the KDevelop-devel mailing list