diff options
author | Michael Valenta | 2003-09-12 13:14:48 +0000 |
---|---|---|
committer | Michael Valenta | 2003-09-12 13:14:48 +0000 |
commit | e1f8fee1dbd3c7a8c82a1c907894dec67ebc2063 (patch) | |
tree | 292c047b37fc415fdc3745fcfc490834dac4ae17 | |
parent | 9ca6e050e4dc48da4247bbdc79db869b55776a57 (diff) | |
download | eclipse.platform.team-e1f8fee1dbd3c7a8c82a1c907894dec67ebc2063.tar.gz eclipse.platform.team-e1f8fee1dbd3c7a8c82a1c907894dec67ebc2063.tar.xz eclipse.platform.team-e1f8fee1dbd3c7a8c82a1c907894dec67ebc2063.zip |
Fix for unmatched beginRule/endRule
-rw-r--r-- | bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ReentrantLock.java | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ReentrantLock.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ReentrantLock.java index 2ba099996..c14556e69 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ReentrantLock.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ReentrantLock.java @@ -10,8 +10,10 @@ *******************************************************************************/ package org.eclipse.team.internal.ccvs.core.syncinfo; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -44,14 +46,23 @@ public class ReentrantLock { private final static boolean DEBUG = Policy.DEBUG_THREADING; + // This is a placeholder rule used to indicate that no scheduling rule is needed + private static final ISchedulingRule NULL_SCHEDULING_RULE= new ISchedulingRule() { + public boolean contains(ISchedulingRule rule) { + return false; + } + public boolean isConflicting(ISchedulingRule rule) { + return false; + } + }; + public class ThreadInfo { private int nestingCount = 0; private Set changedResources = new HashSet(); private Set changedFolders = new HashSet(); private IFlushOperation operation; - private ISchedulingRule schedulingRule; - public ThreadInfo(ISchedulingRule schedulingRule, IFlushOperation operation) { - this.schedulingRule = schedulingRule; + private List rules = new ArrayList(); + public ThreadInfo(IFlushOperation operation) { this.operation = operation; } public void increment() { @@ -97,8 +108,11 @@ public class ReentrantLock { private void handleAbortedFlush(Throwable t) { CVSProviderPlugin.log(new CVSStatus(IStatus.ERROR, Policy.bind("ReentrantLock.9"), t)); //$NON-NLS-1$ } - public ISchedulingRule getSchedulingRule() { - return schedulingRule; + public void addRule(ISchedulingRule rule) { + rules.add(rule); + } + public ISchedulingRule removeRule() { + return (ISchedulingRule)rules.remove(rules.size() - 1); } } @@ -126,11 +140,12 @@ public class ReentrantLock { private void incrementNestingCount(IResource resource, ISchedulingRule rule, IFlushOperation operation) { ThreadInfo info = getThreadInfo(); if (info == null) { - info = new ThreadInfo(rule, operation); + info = new ThreadInfo(operation); Thread thisThread = Thread.currentThread(); infos.put(thisThread, info); if(DEBUG) System.out.println("[" + thisThread.getName() + "] acquired CVS lock on " + resource.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$ } + info.addRule(rule); info.increment(); } @@ -139,20 +154,20 @@ public class ReentrantLock { ISchedulingRule rule; if (resource.getType() == IResource.ROOT) { // Never lock the whole workspace - rule = null; + rule = NULL_SCHEDULING_RULE; } else if (resource.getType() == IResource.PROJECT) { rule = resource; } else { rule = resource.getParent(); } - if (rule != null) { + if (rule != NULL_SCHEDULING_RULE) { Platform.getJobManager().beginRule(rule); } return rule; } private void unlock(ISchedulingRule rule) { - if (rule != null) { + if (rule != NULL_SCHEDULING_RULE) { Platform.getJobManager().endRule(rule); } } @@ -172,8 +187,8 @@ public class ReentrantLock { if(DEBUG) System.out.println("[" + thisThread.getName() + "] released CVS lock"); //$NON-NLS-1$ //$NON-NLS-2$ infos.remove(thisThread); info.flush(monitor); - unlock(info.getSchedulingRule()); } + unlock(info.removeRule()); } public void folderChanged(IContainer folder) { |