bloritsch 01/10/31 06:08:29
Modified: src/test/org/apache/avalon/excalibur/concurrent/test
ReadWriteLockTestCase.java
Log:
Apply fix to ReadWriteLock fromAvi Drissman ([EMAIL PROTECTED])
Revision Changes Path
1.5 +57 -0
jakarta-avalon-excalibur/src/test/org/apache/avalon/excalibur/concurrent/test/ReadWriteLockTestCase.java
Index: ReadWriteLockTestCase.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/src/test/org/apache/avalon/excalibur/concurrent/test/ReadWriteLockTestCase.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ReadWriteLockTestCase.java 2001/10/25 16:00:48 1.4
+++ ReadWriteLockTestCase.java 2001/10/31 14:08:28 1.5
@@ -309,6 +309,63 @@
assertTrue( "Could not aquire a write lock after releasing the
lock.",
lock.tryAquireWrite() );
}
+
+ /**
+ * Tests a condition pointed out to me (L.Sutic) by Avi Drissman
+ * <a href="[EMAIL PROTECTED]">[EMAIL PROTECTED]</a>. If you hold
+ * a read lock, and a thread waiting for a write lock is interrupted,
+ * there is no way to aquire a read lock again.
+ *
+ * (This condition is fixed, 2001-10-31.)
+ */
+ public void testDeadLock () throws Exception {
+ ReadWriteLock lock = new ReadWriteLock();
+ TriesReadLock rla = new TriesReadLock( lock );
+ TriesReadLock rlb = new TriesReadLock( lock );
+ TriesWriteLock wla = new TriesWriteLock( lock );
+ TriesWriteLock wlb = new TriesWriteLock( lock );
+
+ //
+ // Grab a read lock.
+ //
+ rla.start();
+ Thread.currentThread().sleep( 100 );
+ assertTrue( rla.hasSuccess() );
+
+ //
+ // Try to grab a write lock. (The attempt stalls,
+ // because we are holding a read lock.)
+ //
+ wla.start();
+ Thread.currentThread().sleep( 100 );
+ assertTrue( !wla.hasSuccess() );
+
+ //
+ // Interupt the thread waiting for the write lock...
+ //
+ wla.interrupt();
+
+ //
+ // ...and release the read lock.
+ //
+ lock.release();
+
+ //
+ // Right, we are in the condition described by Drissman.
+ // Now try to aquire, in turn, a read and a write lock.
+ // Before the fix, the assertion immediately below
+ // would fail.
+ //
+ rlb.start();
+ Thread.currentThread().sleep( 100 );
+ assertTrue( rlb.hasSuccess() );
+ lock.release();
+
+ wlb.start();
+ Thread.currentThread().sleep( 100 );
+ assertTrue( wlb.hasSuccess() );
+ lock.release();
+ }
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>