Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 123174 Details for
Bug 258352
[Progress] synchronization in ProgressManager too expensive
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Patch v02
Progress Manager Sync 02.txt (text/plain), 8.88 KB, created by
Prakash Rangaraj
on 2009-01-21 02:54:27 EST
(
hide
)
Description:
Patch v02
Filename:
MIME Type:
Creator:
Prakash Rangaraj
Created:
2009-01-21 02:54:27 EST
Size:
8.88 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.ui.workbench >Index: Eclipse UI/org/eclipse/ui/internal/progress/ProgressViewUpdater.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressViewUpdater.java,v >retrieving revision 1.26 >diff -u -r1.26 ProgressViewUpdater.java >--- Eclipse UI/org/eclipse/ui/internal/progress/ProgressViewUpdater.java 24 Mar 2008 19:21:58 -0000 1.26 >+++ Eclipse UI/org/eclipse/ui/internal/progress/ProgressViewUpdater.java 21 Jan 2009 07:31:11 -0000 >@@ -217,13 +217,21 @@ > } > } > >+ /** keep track of how often we schedule the job to avoid overloading the JobManager */ >+ private long lastUpdateJobScheduleRequest = 0; >+ > /** > * Schedule an update. > */ > void scheduleUpdate() { > if (PlatformUI.isWorkbenchRunning()) { >- //Add in a 100ms delay so as to keep priority low >- updateJob.schedule(100); >+ // make sure we don't schedule too often >+ long now = System.currentTimeMillis(); >+ if (now - lastUpdateJobScheduleRequest >= 100) { >+ //Add in a 100ms delay so as to keep priority low >+ updateJob.schedule(100); >+ lastUpdateJobScheduleRequest = now; >+ } > } > } > >Index: Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java,v >retrieving revision 1.140 >diff -u -r1.140 ProgressManager.java >--- Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java 15 Jan 2009 14:33:11 -0000 1.140 >+++ Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java 21 Jan 2009 07:31:11 -0000 >@@ -31,6 +31,7 @@ > import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.runtime.IProgressMonitorWithBlocking; > import org.eclipse.core.runtime.IStatus; >+import org.eclipse.core.runtime.ListenerList; > import org.eclipse.core.runtime.NullProgressMonitor; > import org.eclipse.core.runtime.OperationCanceledException; > import org.eclipse.core.runtime.QualifiedName; >@@ -98,10 +99,9 @@ > > final Object familyKey = new Object(); > >- private IJobProgressManagerListener[] listeners = new IJobProgressManagerListener[0]; >- >- final Object listenersKey = new Object(); >- >+ // list of IJobProgressManagerListener >+ private ListenerList listeners = new ListenerList(); >+ > IJobChangeListener changeListener; > > static final String PROGRESS_VIEW_NAME = "org.eclipse.ui.views.ProgressView"; //$NON-NLS-1$ >@@ -556,20 +556,18 @@ > sleepGroup(group,info); > } > >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- IJobProgressManagerListener listener = listeners[i]; >- // Is this one the user never sees? >- if (isNeverDisplaying(info.getJob(), listener.showsDebug())) >- continue; >- if (listener.showsDebug()) >- listener.refreshJobInfo(info); >- else >- listener.removeJob(info); >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ IJobProgressManagerListener listener = (IJobProgressManagerListener) listenersArray[i]; >+ // Is this one the user never sees? >+ if (isNeverDisplaying(info.getJob(), listener.showsDebug())) >+ continue; >+ if (listener.showsDebug()) >+ listener.refreshJobInfo(info); >+ else >+ listener.removeJob(info); > >- } > } >- > } > > /** >@@ -577,20 +575,18 @@ > * @param group > */ > private void sleepGroup(GroupInfo group, JobInfo info) { >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- >- IJobProgressManagerListener listener = listeners[i]; >- if (isNeverDisplaying(info.getJob(), listener.showsDebug())) >- continue; >- >- if (listener.showsDebug() || group.isActive()) >- listener.refreshGroup(group); >- else >- listener.removeGroup(group); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ >+ IJobProgressManagerListener listener = (IJobProgressManagerListener) listenersArray[i]; >+ if (isNeverDisplaying(info.getJob(), listener.showsDebug())) >+ continue; >+ >+ if (listener.showsDebug() || group.isActive()) >+ listener.refreshGroup(group); >+ else >+ listener.removeGroup(group); > } >- > } > > /** >@@ -662,17 +658,7 @@ > * @param listener > */ > void addListener(IJobProgressManagerListener listener) { >- >- synchronized (listenersKey) { >- ArrayList newListeners = new ArrayList(listeners.length + 1); >- for (int i = 0; i < listeners.length; i++) { >- newListeners.add(listeners[i]); >- } >- newListeners.add(listener); >- listeners = new IJobProgressManagerListener[newListeners.size()]; >- newListeners.toArray(listeners); >- } >- >+ listeners.add(listener); > } > > /** >@@ -682,17 +668,7 @@ > * @param listener > */ > void removeListener(IJobProgressManagerListener listener) { >- synchronized (listenersKey) { >- ArrayList newListeners = new ArrayList(); >- for (int i = 0; i < listeners.length; i++) { >- if (listeners[i].equals(listener)) { >- continue; >- } >- newListeners.add(listeners[i]); >- } >- listeners = new IJobProgressManagerListener[newListeners.size()]; >- newListeners.toArray(listeners); >- } >+ listeners.remove(listener); > } > > /** >@@ -732,12 +708,11 @@ > refreshGroup(group); > } > >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- IJobProgressManagerListener listener = listeners[i]; >- if (!isCurrentDisplaying(info.getJob(), listener.showsDebug())) { >- listener.refreshJobInfo(info); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ IJobProgressManagerListener listener = (IJobProgressManagerListener) listenersArray[i]; >+ if (!isCurrentDisplaying(info.getJob(), listener.showsDebug())) { >+ listener.refreshJobInfo(info); > } > } > } >@@ -749,10 +724,9 @@ > */ > public void refreshGroup(GroupInfo info) { > >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- listeners[i].refreshGroup(info); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ ((IJobProgressManagerListener)listenersArray[i]).refreshGroup(info); > } > } > >@@ -763,10 +737,9 @@ > public void refreshAll() { > > pruneStaleJobs(); >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- listeners[i].refreshAll(); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ ((IJobProgressManagerListener)listenersArray[i]).refreshAll(); > } > > } >@@ -787,15 +760,13 @@ > } > } > >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- IJobProgressManagerListener listener = listeners[i]; >- if (!isCurrentDisplaying(info.getJob(), listener.showsDebug())) { >- listener.removeJob(info); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ IJobProgressManagerListener listener = (IJobProgressManagerListener) listenersArray[i]; >+ if (!isCurrentDisplaying(info.getJob(), listener.showsDebug())) { >+ listener.removeJob(info); > } > } >- > } > > /** >@@ -806,10 +777,9 @@ > */ > public void removeGroup(GroupInfo group) { > >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- listeners[i].removeGroup(group); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ ((IJobProgressManagerListener)listenersArray[i]).removeGroup(group); > } > } > >@@ -825,12 +795,11 @@ > } > > jobs.put(info.getJob(), info); >- synchronized (listenersKey) { >- for (int i = 0; i < listeners.length; i++) { >- IJobProgressManagerListener listener = listeners[i]; >- if (!isCurrentDisplaying(info.getJob(), listener.showsDebug())) { >- listener.addJob(info); >- } >+ Object[] listenersArray = listeners.getListeners(); >+ for (int i = 0; i < listenersArray.length; i++) { >+ IJobProgressManagerListener listener = (IJobProgressManagerListener) listenersArray[i]; >+ if (!isCurrentDisplaying(info.getJob(), listener.showsDebug())) { >+ listener.addJob(info); > } > } > } >@@ -1066,9 +1035,7 @@ > * Shutdown the receiver. > */ > private void shutdown() { >- synchronized (listenersKey) { >- this.listeners = new IJobProgressManagerListener[0]; >- } >+ listeners.clear(); > Job.getJobManager().setProgressProvider(null); > Job.getJobManager().removeJobChangeListener(this.changeListener); > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
pwebster
:
iplog+
Actions:
View
|
Diff
Attachments on
bug 258352
:
120102
|
120665
| 123174