diff options
Diffstat (limited to 'plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java')
-rw-r--r-- | plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java | 111 |
1 files changed, 59 insertions, 52 deletions
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java index e84f07ecb0..8ac82be98d 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/RWOLockManager.java @@ -42,7 +42,9 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo private static final ThreadLocal<Boolean> UNLOCK_ALL = new ThreadLocal<Boolean>(); - private final List<LockState<OBJECT, CONTEXT>> EMPTY_RESULT = Collections.emptyList(); + private static final LockType[] ALL_LOCK_TYPES = LockType.values(); + + private final List<LockState<OBJECT, CONTEXT>> emptyResult = Collections.emptyList(); private final Map<OBJECT, LockState<OBJECT, CONTEXT>> objectToLockStateMap = createObjectToLocksMap(); @@ -63,9 +65,10 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo public List<LockState<OBJECT, CONTEXT>> lock2(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToLock, long timeout) throws InterruptedException { - if (objectsToLock.isEmpty()) + int count = objectsToLock.size(); + if (count == 0) { - return EMPTY_RESULT; + return emptyResult; } if (TRACER.isEnabled()) @@ -79,8 +82,6 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo // Do not synchronize the entire method as it would corrupt the timeout! synchronized (this) { - int count = objectsToLock.size(); - for (;;) { ArrayList<LockState<OBJECT, CONTEXT>> lockStates = getLockStatesForContext(type, context, objectsToLock); @@ -112,12 +113,12 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo unlock2(type, context, objectsToUnlock); } - public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) + public List<LockState<OBJECT, CONTEXT>> unlock2(CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) { - return unlock2(LockType.values(), context, objectsToUnlock); + return unlock2(ALL_LOCK_TYPES, context, objectsToUnlock); } - public synchronized List<LockState<OBJECT, CONTEXT>> unlock2(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) + public List<LockState<OBJECT, CONTEXT>> unlock2(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToUnlock) { return unlock2(new LockType[] { type }, context, objectsToUnlock); } @@ -126,7 +127,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo { if (objectsToUnlock.isEmpty()) { - return EMPTY_RESULT; + return emptyResult; } if (TRACER.isEnabled()) @@ -135,42 +136,46 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo } Set<LockState<OBJECT, CONTEXT>> result = new HashSet<LockState<OBJECT, CONTEXT>>(); + boolean unlockAll = UNLOCK_ALL.get() == Boolean.TRUE; - for (OBJECT o : objectsToUnlock) + synchronized (this) { - LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(o); - if (lockState != null) + for (OBJECT o : objectsToUnlock) { - for (LockType type : types) + LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(o); + if (lockState != null) { - while (lockState.canUnlock(type, context)) + for (LockType type : types) { - lockState.unlock(type, context); - result.add(lockState); - - if (UNLOCK_ALL.get() != Boolean.TRUE) + while (lockState.canUnlock(type, context)) { - break; + lockState.unlock(type, context); + result.add(lockState); + + if (!unlockAll) + { + break; + } } } } } - } - for (LockState<OBJECT, CONTEXT> lockState : result) - { - if (!lockState.hasLocks(context)) + for (LockState<OBJECT, CONTEXT> lockState : result) { - removeLockStateForContext(context, lockState); - } + if (!lockState.hasLocks(context)) + { + removeLockStateForContext(context, lockState); + } - if (lockState.hasNoLocks()) - { - objectToLockStateMap.remove(lockState.getLockedObject()); + if (lockState.hasNoLocks()) + { + objectToLockStateMap.remove(lockState.getLockedObject()); + } } - } - notifyAll(); + notifyAll(); + } return new LinkedList<RWOLockManager.LockState<OBJECT, CONTEXT>>(result); } @@ -185,7 +190,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo Set<LockState<OBJECT, CONTEXT>> lockStates = contextToLockStates.get(context); if (lockStates == null) { - return EMPTY_RESULT; + return emptyResult; } if (TRACER.isEnabled()) @@ -197,7 +202,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo for (LockState<OBJECT, CONTEXT> lockState : lockStates) { - for (LockType type : LockType.values()) + for (LockType type : ALL_LOCK_TYPES) { while (lockState.hasLock(type, context, false)) { @@ -225,23 +230,6 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo return toList(lockStates); } - @SuppressWarnings("unchecked") - private List<LockState<OBJECT, CONTEXT>> toList(Set<LockState<OBJECT, CONTEXT>> lockStates) - { - if (lockStates instanceof List) - { - return (List<LockState<OBJECT, CONTEXT>>)lockStates; - } - - List<LockState<OBJECT, CONTEXT>> list = new LinkedList<LockState<OBJECT, CONTEXT>>(); - for (LockState<OBJECT, CONTEXT> lockState : lockStates) - { - list.add(lockState); - } - - return list; - } - public synchronized boolean hasLock(LockType type, CONTEXT context, OBJECT objectToLock) { LockState<OBJECT, CONTEXT> lockState = objectToLockStateMap.get(objectToLock); @@ -348,9 +336,12 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo private ArrayList<LockState<OBJECT, CONTEXT>> getLockStatesForContext(LockType type, CONTEXT context, Collection<? extends OBJECT> objectsToLock) { - ArrayList<LockState<OBJECT, CONTEXT>> lockStates = new ArrayList<LockState<OBJECT, CONTEXT>>(objectsToLock.size()); + int count = objectsToLock.size(); + ArrayList<LockState<OBJECT, CONTEXT>> lockStates = new ArrayList<LockState<OBJECT, CONTEXT>>(count); + Iterator<? extends OBJECT> it = objectsToLock.iterator(); - for (int i = 0; i < objectsToLock.size(); i++) + + for (int i = 0; i < count; i++) { OBJECT o = it.next(); LockState<OBJECT, CONTEXT> lockState = getOrCreateLockState(o); @@ -380,7 +371,7 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo /** * Removes a lockState from the set of all lockStates that the given context is involved in. If the lockState being * removed is the last one for the given context, then the set becomes empty, and is therefore removed from the - * contextToLockStates mp. + * contextToLockStates map. */ private void removeLockStateForContext(CONTEXT context, LockState<OBJECT, CONTEXT> lockState) { @@ -409,7 +400,23 @@ public class RWOLockManager<OBJECT, CONTEXT> extends Lifecycle implements IRWOLo wait(waitTime); } + } + @SuppressWarnings("unchecked") + private static <OBJECT, CONTEXT> List<LockState<OBJECT, CONTEXT>> toList(Set<LockState<OBJECT, CONTEXT>> lockStates) + { + if (lockStates instanceof List) + { + return (List<LockState<OBJECT, CONTEXT>>)lockStates; + } + + List<LockState<OBJECT, CONTEXT>> list = new LinkedList<LockState<OBJECT, CONTEXT>>(); + for (LockState<OBJECT, CONTEXT> lockState : lockStates) + { + list.add(lockState); + } + + return list; } /** |