From: Ben W. <bw...@us...> - 2004-04-24 21:10:31
|
User: bwang00 Date: 04/04/24 14:10:25 Modified: src/main/org/jboss/cache/lock ReadWriteLockWithUpgrade.java Log: Bug fix when upgrade lock failed and next write lock would fail as well. Revision Changes Path 1.5 +15 -4 jboss-cache/src/main/org/jboss/cache/lock/ReadWriteLockWithUpgrade.java Index: ReadWriteLockWithUpgrade.java =================================================================== RCS file: /cvsroot/jboss/jboss-cache/src/main/org/jboss/cache/lock/ReadWriteLockWithUpgrade.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ReadWriteLockWithUpgrade.java 24 Apr 2004 18:57:20 -0000 1.4 +++ ReadWriteLockWithUpgrade.java 24 Apr 2004 21:10:25 -0000 1.5 @@ -109,7 +109,8 @@ } /** - * Attempt to obtain an upgrade to writer lock. + * Attempt to obtain an upgrade to writer lock. If successful, the read lock is upgraded to + * write lock. If fails, the owner retains the read lock. * * @param msecs Time to wait in millisecons. * @return Sync object. Null if not successful or timeout. @@ -138,8 +139,16 @@ readerLock_.release(); // log("upgradeLock(): readerLock released"); try { - if (!writerLock_.attempt(msecs)) return null; - ; + if (!writerLock_.attempt(msecs)) { + synchronized (writerLock_) { // need to roll it back. + waitingUpgrader_--; + } + if(!readerLock_.attempt(msecs)) { + throw new IllegalStateException("ReadWriteLockWithUpgrade.upgradeLockAttempt():" + + " failed to upgrade to write lock and also failed to re-obtain the read lock"); + } + return null; + } } catch (InterruptedException ex) { return null; } @@ -446,8 +455,10 @@ if (msecs <= 0) { // Upgrade thread has prioirty. if (waitingUpgrader_ != 0) { - if (upgraderLocal_.get() != null) + if (upgraderLocal_.get() != null) { + log_.info("attempt(): upgrade to write lock"); return startWrite(); + } else return false; } else |