Author: ozeigermann
Date: Mon Jul 23 08:00:02 2007
New Revision: 558765
URL: http://svn.apache.org/viewvc?view=rev&rev=558765
Log:
Added tryLock and better internal lock management
Modified:
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/RWLockManager.java
Modified:
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java?view=diff&rev=558765&r1=558764&r2=558765
==============================================================================
---
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java
(original)
+++
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java
Mon Jul 23 08:00:02 2007
@@ -53,5 +53,6 @@
* resource for on which this block of work shall be done
*/
public void lock(M managedResource, K key, boolean exclusive) throws
LockException;
+ public boolean tryLock(M managedResource, K key, boolean exclusive);
}
Modified:
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/RWLockManager.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/RWLockManager.java?view=diff&rev=558765&r1=558764&r2=558765
==============================================================================
---
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/RWLockManager.java
(original)
+++
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/RWLockManager.java
Mon Jul 23 08:00:02 2007
@@ -31,40 +31,32 @@
protected ConcurrentHashMap<KeyEntry<K, M>, ReadWriteLock> locks = new
ConcurrentHashMap<KeyEntry<K, M>, ReadWriteLock>();
- protected Map<Thread, Set<ReadWriteLock>> locksForThreads = new
ConcurrentHashMap<Thread, Set<ReadWriteLock>>();
+ protected Map<Thread, Set<Lock>> locksForThreads = new
ConcurrentHashMap<Thread, Set<Lock>>();
protected Map<ReadWriteLock, Set<Thread>> threadsForLocks = new
ConcurrentHashMap<ReadWriteLock, Set<Thread>>();
protected Map<Thread, Long> effectiveGlobalTimeouts = new
ConcurrentHashMap<Thread, Long>();
// TODO
- public static Iterable<ReadWriteLock> orderLocks() {
- return null;
+ public Iterable<ReadWriteLock> orderLocks() {
+ Set<Lock> locks = locksForThreads.get(Thread.currentThread());
+ if (locks == null) {
+ throw new IllegalStateException("lock() can only be called after
startWork()");
+ }
- }
+ return null;
- // TODO
- public void lockAll(Iterable<ReadWriteLock> locks) {
}
@Override
public void endWork() {
- Set<ReadWriteLock> locks = locksForThreads.get(Thread.currentThread());
+ Set<Lock> locks = locksForThreads.get(Thread.currentThread());
// graceful reaction...
if (locks == null) {
return;
}
- for (ReadWriteLock lock : locks) {
- try {
- lock.readLock().unlock();
- } catch (IllegalMonitorStateException imse) {
- // we do not care
- }
- try {
- lock.writeLock().unlock();
- } catch (IllegalMonitorStateException imse) {
- // we do not care
- }
+ for (Lock lock : locks) {
+ lock.unlock();
// FIXME: We need to do this atomically
Set<Thread> threadsForThisLock = threadsForLocks.get(lock);
@@ -85,7 +77,7 @@
if (isWorking()) {
throw new IllegalStateException("work has already been started");
}
- locksForThreads.put(Thread.currentThread(), new
HashSet<ReadWriteLock>());
+ locksForThreads.put(Thread.currentThread(), new HashSet<Lock>());
long timeoutMSecs = unit.toMillis(timeout);
long now = System.currentTimeMillis();
@@ -149,37 +141,53 @@
}
@Override
+ public boolean isWorking() {
+ return locksForThreads.get(Thread.currentThread()) != null;
+ }
+
+ @Override
public void lock(M managedResource, K key, boolean exclusive) throws
LockException {
long remainingTime = computeRemainingTime();
if (remainingTime < 0) {
throw new LockException(LockException.Code.TIMED_OUT);
}
+ boolean locked = tryLockInternal(managedResource, key, exclusive,
remainingTime,
+ TimeUnit.MILLISECONDS);
+ if (!locked) {
+ throw new LockException(Code.TIMED_OUT, key);
+ }
+ }
- KeyEntry<K, M> entry = new KeyEntry<K, M>(key, managedResource);
+ @Override
+ public boolean tryLock(M managedResource, K key, boolean exclusive) {
+ return tryLockInternal(managedResource, key, exclusive, 0,
TimeUnit.MILLISECONDS);
+ }
+ protected boolean tryLockInternal(M managedResource, K key, boolean
exclusive, long time,
+ TimeUnit unit) throws LockException {
+ KeyEntry<K, M> entry = new KeyEntry<K, M>(key, managedResource);
ReadWriteLock rwlock = putIfAbsent(entry, create());
- Set<ReadWriteLock> locks = locksForThreads.get(Thread.currentThread());
+ Set<Lock> locks = locksForThreads.get(Thread.currentThread());
if (locks == null) {
throw new IllegalStateException("lock() can only be called after
startWork()");
}
- locks.add(rwlock);
Lock lock = exclusive ? rwlock.writeLock() : rwlock.readLock();
try {
- boolean locked = lock.tryLock(remainingTime,
TimeUnit.MILLISECONDS);
- if (!locked) {
- throw new LockException(Code.TIMED_OUT, key);
+ boolean locked;
+ if (time == 0) {
+ locked = lock.tryLock();
+ } else {
+ locked = lock.tryLock(time, unit);
+ }
+ if (locked) {
+ locks.add(lock);
}
+ return locked;
} catch (InterruptedException e) {
throw new LockException(Code.INTERRUPTED, key);
}
-
- }
-
- @Override
- public boolean isWorking() {
- return locksForThreads.get(Thread.currentThread()) != null;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]