--- a/jdk/test/java/util/concurrent/tck/StampedLockTest.java Wed Jul 05 21:58:29 2017 +0200
+++ b/jdk/test/java/util/concurrent/tck/StampedLockTest.java Fri Jul 15 13:51:43 2016 -0700
@@ -745,28 +745,41 @@
public void testTryConvertToOptimisticRead() throws InterruptedException {
StampedLock lock = new StampedLock();
long s, p;
- s = 0L;
- assertFalse((p = lock.tryConvertToOptimisticRead(s)) != 0L);
+ assertEquals(0L, lock.tryConvertToOptimisticRead(0L));
+
assertTrue((s = lock.tryOptimisticRead()) != 0L);
- assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
+ assertEquals(s, lock.tryConvertToOptimisticRead(s));
+ assertTrue(lock.validate(s));
+
+ assertTrue((p = lock.readLock()) != 0L);
+ assertTrue((s = lock.tryOptimisticRead()) != 0L);
+ assertEquals(s, lock.tryConvertToOptimisticRead(s));
+ assertTrue(lock.validate(s));
+ lock.unlockRead(p);
+
assertTrue((s = lock.writeLock()) != 0L);
assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
assertTrue(lock.validate(p));
+
assertTrue((s = lock.readLock()) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
assertTrue(lock.validate(p));
+
assertTrue((s = lock.tryWriteLock()) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
assertTrue(lock.validate(p));
+
assertTrue((s = lock.tryReadLock()) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
assertTrue(lock.validate(p));
+
assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
assertTrue(lock.validate(p));
+
assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
@@ -780,39 +793,67 @@
public void testTryConvertToReadLock() throws InterruptedException {
StampedLock lock = new StampedLock();
long s, p;
- s = 0L;
- assertFalse((p = lock.tryConvertToReadLock(s)) != 0L);
+
+ assertFalse((p = lock.tryConvertToReadLock(0L)) != 0L);
+
assertTrue((s = lock.tryOptimisticRead()) != 0L);
assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
+ assertTrue(lock.isReadLocked());
+ assertEquals(1, lock.getReadLockCount());
lock.unlockRead(p);
+
+ assertTrue((s = lock.tryOptimisticRead()) != 0L);
+ lock.readLock();
+ assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
+ assertTrue(lock.isReadLocked());
+ assertEquals(2, lock.getReadLockCount());
+ lock.unlockRead(p);
+ lock.unlockRead(p);
+
assertTrue((s = lock.writeLock()) != 0L);
assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertTrue(lock.isReadLocked());
+ assertEquals(1, lock.getReadLockCount());
lock.unlockRead(p);
+
assertTrue((s = lock.readLock()) != 0L);
assertTrue(lock.validate(s));
- assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
- assertTrue(lock.validate(p));
- lock.unlockRead(p);
+ assertEquals(s, lock.tryConvertToReadLock(s));
+ assertTrue(lock.validate(s));
+ assertTrue(lock.isReadLocked());
+ assertEquals(1, lock.getReadLockCount());
+ lock.unlockRead(s);
+
assertTrue((s = lock.tryWriteLock()) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertEquals(1, lock.getReadLockCount());
lock.unlockRead(p);
+
assertTrue((s = lock.tryReadLock()) != 0L);
assertTrue(lock.validate(s));
- assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
- assertTrue(lock.validate(p));
- lock.unlockRead(p);
+ assertEquals(s, lock.tryConvertToReadLock(s));
+ assertTrue(lock.validate(s));
+ assertTrue(lock.isReadLocked());
+ assertEquals(1, lock.getReadLockCount());
+ lock.unlockRead(s);
+
assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertTrue(lock.isReadLocked());
+ assertEquals(1, lock.getReadLockCount());
lock.unlockRead(p);
+
assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
assertTrue(lock.validate(s));
- assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
- assertTrue(lock.validate(p));
- lock.unlockRead(p);
+ assertEquals(s, lock.tryConvertToReadLock(s));
+ assertTrue(lock.validate(s));
+ assertTrue(lock.isReadLocked());
+ assertEquals(1, lock.getReadLockCount());
+ lock.unlockRead(s);
}
/**
@@ -822,38 +863,52 @@
public void testTryConvertToWriteLock() throws InterruptedException {
StampedLock lock = new StampedLock();
long s, p;
- s = 0L;
- assertFalse((p = lock.tryConvertToWriteLock(s)) != 0L);
+
+ assertFalse((p = lock.tryConvertToWriteLock(0L)) != 0L);
+
assertTrue((s = lock.tryOptimisticRead()) != 0L);
assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
+ assertTrue(lock.isWriteLocked());
lock.unlockWrite(p);
+
assertTrue((s = lock.writeLock()) != 0L);
- assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
- assertTrue(lock.validate(p));
- lock.unlockWrite(p);
+ assertEquals(s, lock.tryConvertToWriteLock(s));
+ assertTrue(lock.validate(s));
+ assertTrue(lock.isWriteLocked());
+ lock.unlockWrite(s);
+
assertTrue((s = lock.readLock()) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertTrue(lock.isWriteLocked());
lock.unlockWrite(p);
+
assertTrue((s = lock.tryWriteLock()) != 0L);
assertTrue(lock.validate(s));
- assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
- assertTrue(lock.validate(p));
- lock.unlockWrite(p);
+ assertEquals(s, lock.tryConvertToWriteLock(s));
+ assertTrue(lock.validate(s));
+ assertTrue(lock.isWriteLocked());
+ lock.unlockWrite(s);
+
assertTrue((s = lock.tryReadLock()) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertTrue(lock.isWriteLocked());
lock.unlockWrite(p);
+
assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertTrue(lock.isWriteLocked());
lock.unlockWrite(p);
+
assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
assertTrue(lock.validate(s));
assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
assertTrue(lock.validate(p));
+ assertTrue(lock.isWriteLocked());
lock.unlockWrite(p);
}
@@ -903,4 +958,124 @@
assertTrue(lock.tryLock());
}
+ /**
+ * Lock.newCondition throws UnsupportedOperationException
+ */
+ public void testLockViewsDoNotSupportConditions() {
+ StampedLock sl = new StampedLock();
+ assertThrows(UnsupportedOperationException.class,
+ () -> sl.asWriteLock().newCondition(),
+ () -> sl.asReadLock().newCondition(),
+ () -> sl.asReadWriteLock().writeLock().newCondition(),
+ () -> sl.asReadWriteLock().readLock().newCondition());
+ }
+
+ /**
+ * Passing optimistic read stamps to unlock operations result in
+ * IllegalMonitorStateException
+ */
+ public void testCannotUnlockOptimisticReadStamps() {
+ Runnable[] actions = {
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryOptimisticRead();
+ assertTrue(stamp != 0);
+ sl.unlockRead(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryOptimisticRead();
+ sl.unlock(stamp);
+ },
+
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryOptimisticRead();
+ sl.writeLock();
+ sl.unlock(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryOptimisticRead();
+ sl.readLock();
+ sl.unlockRead(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryOptimisticRead();
+ sl.readLock();
+ sl.unlock(stamp);
+ },
+
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
+ assertTrue(stamp != 0);
+ sl.writeLock();
+ sl.unlockWrite(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
+ sl.writeLock();
+ sl.unlock(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
+ sl.readLock();
+ sl.unlockRead(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
+ sl.readLock();
+ sl.unlock(stamp);
+ },
+
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
+ assertTrue(stamp != 0);
+ sl.writeLock();
+ sl.unlockWrite(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
+ sl.writeLock();
+ sl.unlock(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
+ sl.readLock();
+ sl.unlockRead(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ sl.readLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
+ assertTrue(stamp != 0);
+ sl.readLock();
+ sl.unlockRead(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
+ sl.readLock();
+ sl.unlock(stamp);
+ },
+ () -> {
+ StampedLock sl = new StampedLock();
+ sl.readLock();
+ long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
+ sl.readLock();
+ sl.unlock(stamp);
+ },
+ };
+
+ assertThrows(IllegalMonitorStateException.class, actions);
+ }
+
}