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]

Reply via email to