Author: ozeigermann Date: Sat Jan 29 03:26:11 2005 New Revision: 149027 URL: http://svn.apache.org/viewcvs?view=rev&rev=149027 Log: - Extensions for better information retrieval on lock levels and releases
- More lock tests by Armin Waibel - Fix for GenericLock that releases all locks of a certain user when testing if a lock level was available Added: jakarta/commons/proper/transaction/trunk/src/test/org/apache/commons/transaction/locking/LockTestRepeatableReads.java Modified: jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt jakarta/commons/proper/transaction/trunk/project.xml jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java Modified: jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt&r1=149026&p2=jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt (original) +++ jakarta/commons/proper/transaction/trunk/RELEASE-NOTES.txt Sat Jan 29 03:26:11 2005 @@ -57,10 +57,18 @@ ----------------------------------------- - PessimisticMapWrapper now throws the more general LockException from locking package +- Both MultiLevelLock#release and LockManager2#release now return a boolean that indicates if the lock + really has been released BUGFIXES FROM 1.0 beta1 ----------------------- - Fixed deadlock hazard in deadlock detection caused by interleaving access to locks set of an owner +- Fixed timeout that in certain scenarios did not work +- GenericLock test method released all locks held by the testing owner - fixed + +ENHANCEMENTS FROM 1.0 beta1 +----------------------- +- Many extensions for information about locks KNOWN ISSUES ------------ Modified: jakarta/commons/proper/transaction/trunk/project.xml Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/project.xml?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/project.xml&r1=149026&p2=jakarta/commons/proper/transaction/trunk/project.xml&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/project.xml (original) +++ jakarta/commons/proper/transaction/trunk/project.xml Sat Jan 29 03:26:11 2005 @@ -102,6 +102,12 @@ <contributor> <name>Antranig Basman</name> </contributor> + <contributor> + <name>Armin Waibel</name> + <id>arminw</id> + <email>[EMAIL PROTECTED]</email> + <timezone>+1</timezone> + </contributor> </contributors> Modified: jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java&r1=149026&p2=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java (original) +++ jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLock.java Sat Jan 29 03:26:11 2005 @@ -1,7 +1,7 @@ /* * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//transaction/src/java/org/apache/commons/transaction/locking/GenericLock.java,v 1.14 2005/01/13 23:12:44 ozeigermann Exp $ * $Revision: 1.14 $ - * $Date: 2005/01/13 23:12:44 $ + * $Date$ * * ==================================================================== * @@ -171,16 +171,19 @@ * @see MultiLevelLock2#test(Object, int, int) */ public boolean test(Object ownerId, int targetLockLevel, int compatibility) { - boolean success = false; - try { - success = tryLock(ownerId, targetLockLevel, compatibility, false); - } finally { - release(ownerId); - } + boolean success = tryLock(ownerId, targetLockLevel, compatibility, false, true); return success; } /** + * @see MultiLevelLock2#has(Object, int) + */ + public boolean has(Object ownerId, int lockLevel) { + int level = getLockLevel(ownerId); + return (lockLevel <= level); + } + + /** * @see org.apache.commons.transaction.locking.MultiLevelLock#acquire(java.lang.Object, * int, boolean, boolean, long) */ @@ -342,7 +345,7 @@ /** * @see org.apache.commons.transaction.locking.MultiLevelLock#release(Object) */ - public synchronized void release(Object ownerId) { + public synchronized boolean release(Object ownerId) { if (owners.remove(ownerId) != null) { if (logger.isFinerEnabled()) { logger.logFiner( @@ -353,7 +356,9 @@ + System.currentTimeMillis()); } notifyAll(); + return true; } + return false; } /** @@ -479,8 +484,13 @@ owners.put(ownerId, new LockOwner(ownerId, targetLockLevel, compatibility, intention)); } - protected synchronized boolean tryLock(Object ownerId, int targetLockLevel, int compatibility, + protected boolean tryLock(Object ownerId, int targetLockLevel, int compatibility, boolean preferred) { + return tryLock(ownerId, targetLockLevel, compatibility, preferred, false); + } + + protected synchronized boolean tryLock(Object ownerId, int targetLockLevel, int compatibility, + boolean preferred, boolean tryOnly) { LockOwner myLock = (LockOwner) owners.get(ownerId); @@ -522,8 +532,10 @@ // we are only allowed to acquire our locks if we do not compromise locks of any other lock owner if (isCompatible(targetLockLevel, currentLockLevel)) { - // if we really have the lock, it no longer is an intention - setLockLevel(ownerId, myLock, targetLockLevel, compatibility, false); + if (!tryOnly) { + // if we really have the lock, it no longer is an intention + setLockLevel(ownerId, myLock, targetLockLevel, compatibility, false); + } return true; } else { return false; Modified: jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java&r1=149026&p2=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java (original) +++ jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/GenericLockManager.java Sat Jan 29 03:26:11 2005 @@ -134,6 +134,33 @@ } /** + * @see LockManager2#checkLock(Object, Object, int, boolean) + * @since 1.1 + */ + public boolean checkLock(Object ownerId, Object resourceId, int targetLockLevel, boolean reentrant) { + timeoutCheck(ownerId); + + GenericLock lock = (GenericLock) atomicGetOrCreateLock(resourceId); + boolean possible = lock.test(ownerId, targetLockLevel, + reentrant ? GenericLock.COMPATIBILITY_REENTRANT : GenericLock.COMPATIBILITY_NONE); + + return possible; + } + + /** + * @see LockManager2#hasLock(Object, Object, int) + * @since 1.1 + */ + public boolean hasLock(Object ownerId, Object resourceId, int lockLevel) { + timeoutCheck(ownerId); + + GenericLock lock = (GenericLock) atomicGetOrCreateLock(resourceId); + boolean owned = lock.has(ownerId, lockLevel); + + return owned; + } + + /** * @see LockManager2#lock(Object, Object, int, boolean) * @since 1.1 */ @@ -261,11 +288,12 @@ * @see LockManager2#release(Object, Object) * @since 1.1 */ - public void release(Object ownerId, Object resourceId) { + public boolean release(Object ownerId, Object resourceId) { timeoutCheck(ownerId); GenericLock lock = (GenericLock) atomicGetOrCreateLock(resourceId); - lock.release(ownerId); + boolean released = lock.release(ownerId); removeOwner(ownerId, lock); + return released; } /** Modified: jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java&r1=149026&p2=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java (original) +++ jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/LockManager2.java Sat Jan 29 03:26:11 2005 @@ -1,7 +1,7 @@ /* * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//transaction/src/java/org/apache/commons/transaction/locking/LockManager2.java,v 1.5 2005/01/10 00:04:27 ozeigermann Exp $ * $Revision: 1.5 $ - * $Date: 2005/01/10 00:04:27 $ + * $Date$ * * ==================================================================== * @@ -40,6 +40,41 @@ public interface LockManager2 { /** + * Determines if a lock is owner by an owner. <br> + * + * @param ownerId + * a unique id identifying the entity that wants to check this + * lock + * @param resourceId + * the resource to get the level for + * @param lockLevel + * the lock level to check + * @return <code>true</code> if the owner has the lock, <code>false</code> otherwise + * + */ + public boolean hasLock(Object ownerId, Object resourceId, int lockLevel); + + /** + * Determines if a lock <em>could</em> be acquire <em>without</em> actually acquiring it. <br> + * <br> + * This method does not block, but immediatly returns. + * + * @param ownerId + * a unique id identifying the entity that wants to check this + * lock + * @param resourceId + * the resource to get the level for + * @param targetLockLevel + * the lock level to check + * @param reentrant + * <code>true</code> if this request shall not be influenced by + * other locks held by the same owner + * @return <code>true</code> if the lock could be acquired, <code>false</code> otherwise + * + */ + public boolean checkLock(Object ownerId, Object resourceId, int targetLockLevel, boolean reentrant); + + /** * Tries to acquire a lock on a resource. <br> * <br> * This method does not block, but immediatly returns. If a lock is not @@ -53,7 +88,7 @@ * @param targetLockLevel * the lock level to acquire * @param reentrant - * <code>true</code> if this request shall not be blocked by + * <code>true</code> if this request shall not be influenced by * other locks held by the same owner * @return <code>true</code> if the lock has been acquired, <code>false</code> otherwise * @@ -170,8 +205,10 @@ * * @param ownerId the id of the owner of the lock * @param resourceId the resource to releases the lock for + * @return <code>true</code> if the lock actually was released, <code>false</code> in case + * there was no lock held by the owner */ - public void release(Object ownerId, Object resourceId); + public boolean release(Object ownerId, Object resourceId); /** * Releases all locks (partially) held by an owner. Modified: jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java&r1=149026&p2=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java (original) +++ jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java Sat Jan 29 03:26:11 2005 @@ -1,7 +1,7 @@ /* * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//transaction/src/java/org/apache/commons/transaction/locking/MultiLevelLock.java,v 1.1 2004/11/18 23:27:17 ozeigermann Exp $ * $Revision: 1.1 $ - * $Date: 2004/11/18 23:27:17 $ + * $Date$ * * ==================================================================== * @@ -51,8 +51,10 @@ * Releases any lock levels the specified owner may hold on this lock. * * @param ownerId a unique id identifying the entity that wants to release all lock levels + * @return <code>true</code> if the lock actually was released, <code>false</code> in case + * there was no lock held by the owner */ - public void release(Object ownerId); + public boolean release(Object ownerId); /** * Retuns the highest lock level the specified owner holds on this lock or <code>0</code> if it holds no locks at all. Modified: jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java&r1=149026&p2=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java (original) +++ jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java Sat Jan 29 03:26:11 2005 @@ -1,7 +1,7 @@ /* * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//transaction/src/java/org/apache/commons/transaction/locking/MultiLevelLock2.java,v 1.3 2005/01/09 23:56:07 ozeigermann Exp $ * $Revision: 1.3 $ - * $Date: 2005/01/09 23:56:07 $ + * $Date$ * * ==================================================================== * @@ -63,11 +63,24 @@ public static final int COMPATIBILITY_REENTRANT_AND_SUPPORT = 3; /** + * Tests if a certain lock level is owned by an owner. + * + * @param ownerId + * a unique id identifying the entity that wants to check a + * certain lock level on this lock + * @param lockLevel + * the lock level to test + * @return <code>true</code> if the lock could be acquired at the time + * this method was called + */ + public boolean has(Object ownerId, int lockLevel); + + /** * Tests if a certain lock level <em>could</em> be acquired. This method * tests only and does <em>not actually acquire</em> the lock. * * @param ownerId - * a unique id identifying the entity that wants to acquire a + * a unique id identifying the entity that wants to test a * certain lock level on this lock * @param targetLockLevel * the lock level to acquire Modified: jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java?view=diff&rev=149027&p1=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java&r1=149026&p2=jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java&r2=149027 ============================================================================== --- jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java (original) +++ jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java Sat Jan 29 03:26:11 2005 @@ -1,7 +1,7 @@ /* * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//transaction/src/java/org/apache/commons/transaction/locking/ReadWriteLockManager.java,v 1.4 2005/01/09 15:12:11 ozeigermann Exp $ * $Revision: 1.4 $ - * $Date: 2005/01/09 15:12:11 $ + * $Date$ * * ==================================================================== * @@ -80,6 +80,72 @@ */ public boolean tryWriteLock(Object ownerId, Object resourceId) { return tryLock(ownerId, resourceId, ReadWriteLock.WRITE_LOCK, true); + } + + /** + * Determines if a shared, reentrant read lock on a resource + * <em>could</em> be acquired without actually acquiring it. <br> + * <br> + * This method does not block, but immediatly returns. If a lock is not + * available <code>false</code> will be returned. + * + * @param ownerId + * a unique id identifying the entity that wants to acquire this + * lock + * @param resourceId + * the resource to get the lock for + * @return <code>true</code> if the lock could be acquired, <code>false</code> otherwise + */ + public boolean checkReadLock(Object ownerId, Object resourceId) { + return checkLock(ownerId, resourceId, ReadWriteLock.READ_LOCK, true); + } + + /** + * Determines if an exclusive, reentrant write lock on a resource + * is held by an owner. <br> + * + * @param ownerId + * a unique id identifying the entity that wants to check this + * lock + * @param resourceId + * the resource to get the lock for + * @return <code>true</code> if the lock is held by the owner, <code>false</code> otherwise + */ + public boolean hasWriteLock(Object ownerId, Object resourceId) { + return hasLock(ownerId, resourceId, ReadWriteLock.WRITE_LOCK); + } + + /** + * Determines if a shared, reentrant read lock on a resource + * is held by an owner. <br> + * + * @param ownerId + * a unique id identifying the entity that wants to check this + * lock + * @param resourceId + * the resource to get the lock for + * @return <code>true</code> if the lock is held by the owner, <code>false</code> otherwise + */ + public boolean hasReadLock(Object ownerId, Object resourceId) { + return hasLock(ownerId, resourceId, ReadWriteLock.READ_LOCK); + } + + /** + * Determines if an exclusive, reentrant write lock on a resource + * <em>could</em> be acquired without actually acquiring it. <br> + * <br> + * This method does not block, but immediatly returns. If a lock is not + * available <code>false</code> will be returned. + * + * @param ownerId + * a unique id identifying the entity that wants to acquire this + * lock + * @param resourceId + * the resource to get the lock for + * @return <code>true</code> if the lock could be acquired, <code>false</code> otherwise + */ + public boolean checkWriteLock(Object ownerId, Object resourceId) { + return checkLock(ownerId, resourceId, ReadWriteLock.WRITE_LOCK, true); } /** Added: jakarta/commons/proper/transaction/trunk/src/test/org/apache/commons/transaction/locking/LockTestRepeatableReads.java Url: http://svn.apache.org/viewcvs/jakarta/commons/proper/transaction/trunk/src/test/org/apache/commons/transaction/locking/LockTestRepeatableReads.java?view=auto&rev=149027 ============================================================================== --- (empty file) +++ jakarta/commons/proper/transaction/trunk/src/test/org/apache/commons/transaction/locking/LockTestRepeatableReads.java Sat Jan 29 03:26:11 2005 @@ -0,0 +1,276 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//transaction/src/test/org/apache/commons/transaction/locking/GenericLockTest.java,v 1.12 2005/01/13 16:44:03 ozeigermann Exp $ + * $Revision: 1.12 $ + * $Date: 2005-01-29 07:43:19 +0100 (Sa, 29 Jan 2005) $ + * + * ==================================================================== + * + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.commons.transaction.locking; + +import java.io.PrintWriter; + +import junit.framework.TestCase; + +import org.apache.commons.transaction.util.LoggerFacade; +import org.apache.commons.transaction.util.PrintWriterLogger; + +/** + * Tests for repeatable read in locks as investigated for OJB. + * + * @version $Revision: 1.12 $ + * @author Armin Waibel + */ +public class LockTestRepeatableReads extends TestCase +{ + private static final LoggerFacade logFacade = new PrintWriterLogger(new PrintWriter(System.out), + LockTestRepeatableReads.class.getName(), false); + + protected static final long TIMEOUT = 1000000; + + public static void main(String[] args) + { + String[] arr = {LockTestRepeatableReads.class.getName()}; + junit.textui.TestRunner.main(arr); + } + + public LockTestRepeatableReads(String name) + { + super(name); + } + + Object tx1; + Object tx2; + Object obj; + ReadWriteUpgradeLockManager lockManager; + + public void setUp() throws Exception + { + super.setUp(); + + lockManager = new ReadWriteUpgradeLockManager(logFacade, TIMEOUT); + + // initialize the dummies + tx2 = new Object(); + tx1 = new Object(); + obj = new Object(); + } + + public void tearDown() throws Exception + { + try + { + lockManager.release(tx1, obj); + lockManager.release(tx2, obj); + } + finally + { + super.tearDown(); + } + } + + /** + * Test 19 + */ + public void testWriteReleaseCheckRead() + { + assertTrue(lockManager.tryWriteLock(tx2, obj)); + assertTrue(lockManager.checkReadLock(tx2, obj)); + assertTrue(lockManager.release(tx2, obj)); + assertFalse(lockManager.hasReadLock(tx2, obj)); + } + + /** + * Test 20 + */ + public void testReadWriteReleaseCheckRead() + { + assertTrue(lockManager.tryReadLock(tx2, obj)); + assertTrue(lockManager.tryWriteLock(tx2, obj)); + assertTrue(lockManager.checkReadLock(tx2, obj)); + assertTrue(lockManager.release(tx2, obj)); + assertFalse(lockManager.hasReadLock(tx2, obj)); + } + + /** + * Test 1 + */ + public void testSingleReadLock() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + } + + /** + * Test 2 + */ + public void testUpgradeReadLock() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryUpgradeLock(tx1, obj)); + } + + /** + * Test3 + */ + public void testReadThenWrite() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryWriteLock(tx1, obj)); + } + + /** + * Test 4 + */ + public void testSingleWriteLock() + { + assertTrue(lockManager.tryWriteLock(tx1, obj)); + } + + /** + * Test 5 + */ + public void testWriteThenRead() + { + assertTrue(lockManager.tryWriteLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx1, obj)); + } + + /** + * Test 6 + */ + public void testMultipleReadLock() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx2, obj)); + } + + /** + * Test 7 + */ + public void testUpgradeWithExistingReader() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryUpgradeLock(tx2, obj)); + } + + /** + * Test 8 + */ + public void testWriteWithExistingReader() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertFalse(lockManager.tryWriteLock(tx2, obj)); + } + + /** + * Test 9 + */ + public void testUpgradeWithMultipleReaders() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx2, obj)); + assertTrue(lockManager.tryUpgradeLock(tx2, obj)); + } + + /** + * Test 10 + */ + public void testWriteWithMultipleReaders() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx2, obj)); + assertTrue(!lockManager.tryWriteLock(tx2, obj)); + } + + /** + * Test 11 + */ + public void testUpgradeWithMultipleReadersOn1() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx2, obj)); + assertTrue(lockManager.tryUpgradeLock(tx1, obj)); + } + + /** + * Test 12 + */ + public void testWriteWithMultipleReadersOn1() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx2, obj)); + assertFalse(lockManager.tryWriteLock(tx1, obj)); + } + + /** + * Test 13 + */ + public void testReadWithExistingWriter() + { + assertTrue(lockManager.tryWriteLock(tx1, obj)); + assertFalse(lockManager.tryReadLock(tx2, obj)); + } + + /** + * Test 14 + */ + public void testMultipleWriteLock() + { + assertTrue(lockManager.tryWriteLock(tx1, obj)); + assertFalse(lockManager.tryWriteLock(tx2, obj)); + } + + /** + * Test 15 + */ + public void testReleaseReadLock() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.release(tx1, obj)); + assertTrue(lockManager.tryWriteLock(tx2, obj)); + } + + /** + * Test 16 + */ + public void testReleaseUpgradeLock() + { + assertTrue(lockManager.tryUpgradeLock(tx1, obj)); + assertTrue(lockManager.release(tx1, obj)); + assertTrue(lockManager.tryWriteLock(tx2, obj)); + } + + /** + * Test 17 + */ + public void testReleaseWriteLock() + { + assertTrue(lockManager.tryWriteLock(tx1, obj)); + assertTrue(lockManager.release(tx1, obj)); + assertTrue(lockManager.tryWriteLock(tx2, obj)); + } + + /** + * Test 18 + */ + public void testReadThenRead() + { + assertTrue(lockManager.tryReadLock(tx1, obj)); + assertTrue(lockManager.tryReadLock(tx1, obj)); + } +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]