mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Bug 224707 - PathEntryManager inefficient usage of jobs
This commit is contained in:
parent
ec58119cbe
commit
849ac074a6
1 changed files with 52 additions and 35 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2007 QNX Software Systems and others.
|
* Copyright (c) 2000, 2008 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
* Anton Leherbauer (Wind River Systems)
|
* Anton Leherbauer (Wind River Systems)
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
|
* IBM Corporation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.model;
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ import java.util.HashMap;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
@ -60,6 +62,7 @@ import org.eclipse.core.resources.IMarker;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.IWorkspaceRunnable;
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
|
import org.eclipse.core.resources.WorkspaceJob;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IConfigurationElement;
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
import org.eclipse.core.runtime.IExtension;
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
@ -119,9 +122,25 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
private Map<IProject, IPathEntryStore> storeMap = new HashMap<IProject, IPathEntryStore>();
|
private Map<IProject, IPathEntryStore> storeMap = new HashMap<IProject, IPathEntryStore>();
|
||||||
|
|
||||||
private static PathEntryManager pathEntryManager;
|
private static PathEntryManager pathEntryManager;
|
||||||
|
|
||||||
|
protected ConcurrentLinkedQueue<PathEntryProblem> markerProblems = new ConcurrentLinkedQueue<PathEntryProblem>();
|
||||||
|
|
||||||
|
//Setting up a generate markers job, it does not get scheduled
|
||||||
|
Job markerTask = new GenerateMarkersJob("PathEntry Marker Job"); //$NON-NLS-1$
|
||||||
|
|
||||||
private PathEntryManager() {
|
private PathEntryManager() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class PathEntryProblem {
|
||||||
|
IProject project;
|
||||||
|
ICModelStatus[] problems;
|
||||||
|
|
||||||
|
public PathEntryProblem(IProject project, ICModelStatus[] problems) {
|
||||||
|
this.project = project;
|
||||||
|
this.problems = problems;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class PathEntryContainerLock implements IPathEntryContainer {
|
private class PathEntryContainerLock implements IPathEntryContainer {
|
||||||
|
|
||||||
boolean runInitializer;
|
boolean runInitializer;
|
||||||
|
@ -585,7 +604,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
problemList.toArray(problems);
|
problemList.toArray(problems);
|
||||||
IProject project = cproject.getProject();
|
IProject project = cproject.getProject();
|
||||||
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
|
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
|
||||||
generateMarkers(project, problems);
|
addProblemMarkers(project, problems);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,40 +1013,38 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generateMarkers(final IProject project, final ICModelStatus[] problems) {
|
/**
|
||||||
Job markerTask = new Job("PathEntry Marker Job") { //$NON-NLS-1$
|
* Collects path entry errors for each project and generate error markers for these errors
|
||||||
|
* @param project - Project with path entry errors
|
||||||
/*
|
* @param problems - The path entry errors associated with the project
|
||||||
* (non-Javadoc)
|
*/
|
||||||
*
|
public void addProblemMarkers(final IProject project, final ICModelStatus[] problems) {
|
||||||
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
|
PathEntryProblem problem = new PathEntryProblem(project, problems);
|
||||||
*/
|
//queue up the problems to be logged
|
||||||
@Override
|
markerProblems.add(problem);
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
//generate the error markers
|
||||||
try {
|
|
||||||
CCorePlugin.getWorkspace().run(new IWorkspaceRunnable() {
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
|
|
||||||
*/
|
|
||||||
public void run(IProgressMonitor mon) throws CoreException {
|
|
||||||
PathEntryUtil.flushPathEntryProblemMarkers(project);
|
|
||||||
for (int i = 0; i < problems.length; ++i) {
|
|
||||||
PathEntryUtil.createPathEntryProblemMarker(project, problems[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, null);
|
|
||||||
} catch (CoreException e) {
|
|
||||||
return e.getStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status.OK_STATUS;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
ISchedulingRule rule = project.getWorkspace().getRuleFactory().markerRule(project);
|
|
||||||
markerTask.setRule(rule);
|
|
||||||
markerTask.schedule();
|
markerTask.schedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class GenerateMarkersJob extends WorkspaceJob {
|
||||||
|
public GenerateMarkersJob(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStatus runInWorkspace(IProgressMonitor monitor) {
|
||||||
|
while (markerProblems.peek() != null) {
|
||||||
|
PathEntryProblem problem = markerProblems.poll();
|
||||||
|
IProject project = problem.project;
|
||||||
|
ICModelStatus[] problems = problem.problems;
|
||||||
|
PathEntryUtil.flushPathEntryProblemMarkers(project);
|
||||||
|
for (int i = 0; i < problems.length; ++i) {
|
||||||
|
PathEntryUtil.createPathEntryProblemMarker(project, problems[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean needDelta(ICProject cproject){
|
private boolean needDelta(ICProject cproject){
|
||||||
try {
|
try {
|
||||||
|
@ -1337,7 +1354,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
|
ICModelStatus[] problems = new ICModelStatus[problemList.size()];
|
||||||
problemList.toArray(problems);
|
problemList.toArray(problems);
|
||||||
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
|
if (PathEntryUtil.hasPathEntryProblemMarkersChange(project, problems)) {
|
||||||
generateMarkers(project, problems);
|
addProblemMarkers(project, problems);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue