[kdevplatform] shell: Fix a possible crash when working with split-views and when the working-set is active in multiple areas.

Lambert CLARA lambert.clara at yahoo.fr
Tue Jul 19 21:21:34 UTC 2011


Hello all,

Since this commit, the shell-buddytest unit test does not pass anymore.
It seems to fail in workingsetcontroller.cpp at area->clearViews(true);
When I comment this line, it passes again.

Is it a false negative ?

L

On mardi 19 juillet 2011 14:55:10 David Nolden wrote:
> Git commit 3e8ee920d901e4bb11eebe398728054f7c9126f1 by David Nolden.
> Committed on 19/07/2011 at 14:53.
> Pushed by zwabel into branch 'master'.
> 
> Fix a possible crash when working with split-views and when the working-set is active in multiple areas.
> 
> It doesn't seem to be safe to clear one whole area while working on another one, so bring back the old updating code which only selectively closes views.
> Clear the whole area on a higher level while switching working-sets, to make sure we sublime doesn't break while updating the views.
> CCMAIL: kdevelop-devel at barney.cs.uni-potsdam.de
> BUG: 277961
> 
> M  +4    -2    shell/workingsetcontroller.cpp
> M  +7    -2    shell/workingsets/workingset.cpp
> 
> http://commits.kde.org/kdevplatform/3e8ee920d901e4bb11eebe398728054f7c9126f1
> 
> diff --git a/shell/workingsetcontroller.cpp b/shell/workingsetcontroller.cpp
> index a6a5b94..457df1c 100644
> --- a/shell/workingsetcontroller.cpp
> +++ b/shell/workingsetcontroller.cpp
> @@ -303,11 +303,13 @@ void WorkingSetController::changedWorkingSet(Sublime::Area* area, const QString&
>      if (from == to)
>          return;
>  
> +    // We have to always clear the target area first, because else we cannot perform the switch safely
> +    // (sublime doesn't accept all kinds of changes to the area structure)
> +    area->clearViews(true);
> +    
>      if (!to.isEmpty()) {
>          WorkingSet* newSet = getWorkingSet(to);
>          newSet->loadToArea(area, area->rootIndex(), !from.isEmpty());
> -    } else {
> -        area->clearViews(true);
>      }
>  
>      emit workingSetSwitched();
> diff --git a/shell/workingsets/workingset.cpp b/shell/workingsets/workingset.cpp
> index 4399260..9b172e4 100644
> --- a/shell/workingsets/workingset.cpp
> +++ b/shell/workingsets/workingset.cpp
> @@ -179,14 +179,19 @@ void WorkingSet::loadToArea(Sublime::Area* area, Sublime::AreaIndex* areaIndex,
>      DisableMainWindowUpdatesFromArea updatesDisabler(area);
>  
>      kDebug() << "loading working-set" << m_id << "into area" << area;
> -
>      if(clear) {
>          kDebug() << "clearing area with working-set" << area->workingSet();
> +        
>          // We have to close all views, else we may get serious UI
>          // consistency problems when the documents intersect.
>          // Clear the views silently, because the user should be batch-asked
>          // before changing working sets.
> -        area->clearViews(true);
> +        QSet< QString > files = fileList().toSet();
> +        foreach(Sublime::View* view, area->views()) {
> +            Sublime::UrlDocument* doc = dynamic_cast<Sublime::UrlDocument*>(view->document());
> +            if(!doc || !files.contains(doc->documentSpecifier()))
> +                area->closeView(view);
> +        }   
>      }
>  
>      KConfigGroup setConfig(Core::self()->activeSession()->config(), "Working File Sets");
> 
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20110719/a27a9c10/attachment.html>


More information about the KDevelop-devel mailing list