1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Bug 422797 - Fix for synchronization and update in QMakeProjectInfo

handleEvent method updates for related project only
and does not fire listeners under 'sync' lock.

Change-Id: Id9726925ff9c044a3c13238406bdf3228ccf2933
Signed-off-by: David Kaspar <dkaspar@blackberry.com>
Reviewed-on: https://git.eclipse.org/r/19361
Reviewed-by: Andrew Eidsness <eclipse@jfront.com>
Reviewed-by: Doug Schaefer <dschaefer@qnx.com>
IP-Clean: Doug Schaefer <dschaefer@qnx.com>
Tested-by: Doug Schaefer <dschaefer@qnx.com>
This commit is contained in:
David Kaspar 2013-12-05 11:25:25 +01:00 committed by Doug Schaefer
parent bd84e07bc6
commit 4546692659

View file

@ -106,7 +106,7 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
} }
} }
private final ICProjectDescription projectDescription; private final IProject project;
// sync object for all mutable fields // sync object for all mutable fields
private final Object sync = new Object(); private final Object sync = new Object();
@ -122,7 +122,7 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
private final List<IQMakeProjectInfoListener> listeners = new CopyOnWriteArrayList<IQMakeProjectInfoListener>(); private final List<IQMakeProjectInfoListener> listeners = new CopyOnWriteArrayList<IQMakeProjectInfoListener>();
private QMakeProjectInfo(IProject project) { private QMakeProjectInfo(IProject project) {
projectDescription = CoreModel.getDefault().getProjectDescriptionManager().getProjectDescription(project); this.project = project;
CoreModel.getDefault().addCProjectDescriptionListener(this, ICDescriptionDelta.ACTIVE_CFG); CoreModel.getDefault().addCProjectDescriptionListener(this, ICDescriptionDelta.ACTIVE_CFG);
updateActiveConfiguration(); updateActiveConfiguration();
} }
@ -135,36 +135,39 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
} }
live = false; live = false;
CoreModel.getDefault().removeCProjectDescriptionListener(this); CoreModel.getDefault().removeCProjectDescriptionListener(this);
removeActiveConfiguration(); setActiveConfiguration(null);
qmakeInfo = QMakeInfo.INVALID; qmakeInfo = QMakeInfo.INVALID;
} }
} }
// removes active configuration private void updateActiveConfiguration() {
private void removeActiveConfiguration() { synchronized (sync) {
if (! live) {
return;
}
ICProjectDescription projectDescription = CoreModel.getDefault().getProjectDescriptionManager().getProjectDescription(project);
setActiveConfiguration(projectDescription != null ? projectDescription.getActiveConfiguration() : null);
qmakeInfo = null;
}
notifyListeners();
}
// called under synchronized (sync)
private void setActiveConfiguration(ICConfigurationDescription configuration) {
ControllerImpl previous = activeController; ControllerImpl previous = activeController;
activeController = null; activeController = configuration != null ? new ControllerImpl(configuration) : null;
if (previous != null) { if (previous != null) {
previous.destroy(); previous.destroy();
} }
} }
// updates active configuration
private void updateActiveConfiguration() {
ICConfigurationDescription configuration = projectDescription.getActiveConfiguration();
if (configuration != null) {
activeController = new ControllerImpl(configuration);
}
scheduleFetchQMakeInfo();
}
// called on active project configuration change // called on active project configuration change
@Override @Override
public void handleEvent(CProjectDescriptionEvent event) { public void handleEvent(CProjectDescriptionEvent event) {
synchronized (sync) { if (event.getProject() != project) {
removeActiveConfiguration(); return;
updateActiveConfiguration();
} }
updateActiveConfiguration();
} }
@Override @Override
@ -270,6 +273,10 @@ public final class QMakeProjectInfo implements IQMakeProjectInfo, ICProjectDescr
} }
qmakeInfo = null; qmakeInfo = null;
} }
notifyListeners();
}
private void notifyListeners() {
for (IQMakeProjectInfoListener listener : listeners) { for (IQMakeProjectInfoListener listener : listeners) {
listener.qmakeInfoChanged(); listener.qmakeInfoChanged();
} }