Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 95294 invoked from network); 1 Feb 2011 15:06:43 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 1 Feb 2011 15:06:43 -0000 Received: (qmail 83598 invoked by uid 500); 1 Feb 2011 15:06:43 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 83498 invoked by uid 500); 1 Feb 2011 15:06:39 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 83487 invoked by uid 99); 1 Feb 2011 15:06:39 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Feb 2011 15:06:39 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Feb 2011 15:06:36 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 86E2623889B3; Tue, 1 Feb 2011 15:06:15 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1066061 - in /jackrabbit/branches/2.2: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java Date: Tue, 01 Feb 2011 15:06:15 -0000 To: commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110201150615.86E2623889B3@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jukka Date: Tue Feb 1 15:06:15 2011 New Revision: 1066061 URL: http://svn.apache.org/viewvc?rev=1066061&view=rev Log: 2.2: Merged revision 1066059 (JCR-2855) Modified: jackrabbit/branches/2.2/ (props changed) jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java Propchange: jackrabbit/branches/2.2/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Feb 1 15:06:15 2011 @@ -2,4 +2,4 @@ /jackrabbit/sandbox/JCR-1456:774917-886178 /jackrabbit/sandbox/JCR-2170:812417-816332 /jackrabbit/sandbox/tripod-JCR-2209:795441-795863 -/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1044312,1049473,1049491,1049520,1050346,1050551,1055068,1055070-1055071,1055116-1055117,1055127,1055134,1055164,1055498,1060431,1060434,1060753,1063756,1065599,1065622 +/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040606,1040661,1040958,1041379,1041439,1041761,1042643,1042647,1042978-1042982,1043084-1043086,1043088,1043343,1043357-1043358,1043430,1043554,1043616,1043618,1043637,1043656,1044312,1049473,1049491,1049520,1050346,1050551,1055068,1055070-1055071,1055116-1055117,1055127,1055134,1055164,1055498,1060431,1060434,1060753,1063756,1065599,1065622,1066059 Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java?rev=1066061&r1=1066060&r2=1066061&view=diff ============================================================================== --- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java (original) +++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java Tue Feb 1 15:06:15 2011 @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.jackrabbit.core.id.ItemId; import org.apache.jackrabbit.core.id.NodeId; @@ -65,17 +66,23 @@ public class FineGrainedISMLocking imple private final LockMap readLockMap = new LockMap(); /** + * Number of current readers. + */ + private final AtomicInteger readerCount = new AtomicInteger(0); + + /** * List of waiting readers that are blocked because they conflict with * the current writer. */ - private List waitingReaders = Collections.synchronizedList(new LinkedList()); + private List waitingReaders = + Collections.synchronizedList(new LinkedList()); /** * List of waiting writers that are blocked because there is already a * current writer or one of the current reads conflicts with the change log * of the blocked writer. */ - private List waitingWriters = new LinkedList(); + private List waitingWriters = new LinkedList(); /** * {@inheritDoc} @@ -84,6 +91,7 @@ public class FineGrainedISMLocking imple throws InterruptedException { if (isSameThreadId(activeWriterId, getCurrentThreadId())) { // we hold the write lock + readerCount.incrementAndGet(); readLockMap.addLock(id); return new ReadLockImpl(id); } @@ -98,6 +106,7 @@ public class FineGrainedISMLocking imple try { if (activeWriter == null || !hasDependency(activeWriter.changes, id)) { + readerCount.incrementAndGet(); readLockMap.addLock(id); return new ReadLockImpl(id); } else { @@ -176,6 +185,7 @@ public class FineGrainedISMLocking imple } public ReadLock downgrade() { + readerCount.incrementAndGet(); readLockMap.addLock(null); Sync exclusive = writerStateRWLock.writeLock(); for (;;) { @@ -226,6 +236,9 @@ public class FineGrainedISMLocking imple } try { readLockMap.removeLock(id); + if (readerCount.decrementAndGet() == 0 && activeWriter == null) { + activeWriterId = null; + } if (!isSameThreadId(activeWriterId, getCurrentThreadId())) { // only notify waiting writers if we do *not* hold a write // lock at the same time. that would be a waste of cpu time. @@ -256,9 +269,9 @@ public class FineGrainedISMLocking imple * only one thread calls this method at a time. */ private void notifyWaitingReaders() { - Iterator it = waitingReaders.iterator(); + Iterator it = waitingReaders.iterator(); while (it.hasNext()) { - ((Sync) it.next()).release(); + it.next().release(); it.remove(); } } @@ -271,9 +284,9 @@ public class FineGrainedISMLocking imple if (waitingWriters.isEmpty()) { return; } - Iterator it = waitingWriters.iterator(); + Iterator it = waitingWriters.iterator(); while (it.hasNext()) { - ((Sync) it.next()).release(); + it.next().release(); it.remove(); } } @@ -284,7 +297,8 @@ public class FineGrainedISMLocking imple /** * 16 slots */ - private final Map[] slots = new Map[0x10]; + @SuppressWarnings("unchecked") + private final Map[] slots = new Map[0x10]; /** * Flag that indicates if the entire map is locked. @@ -293,7 +307,7 @@ public class FineGrainedISMLocking imple public LockMap() { for (int i = 0; i < slots.length; i++) { - slots[i] = new HashMap(); + slots[i] = new HashMap(); } } @@ -312,7 +326,7 @@ public class FineGrainedISMLocking imple global = true; return; } - Map locks = slots[slotIndex(id)]; + Map locks = slots[slotIndex(id)]; synchronized (locks) { Integer i = (Integer) locks.get(id); if (i == null) { @@ -339,7 +353,7 @@ public class FineGrainedISMLocking imple global = false; return; } - Map locks = slots[slotIndex(id)]; + Map locks = slots[slotIndex(id)]; synchronized (locks) { Integer i = (Integer) locks.get(id); if (i != null) { @@ -370,14 +384,10 @@ public class FineGrainedISMLocking imple return true; } for (int i = 0; i < slots.length; i++) { - Map locks = slots[i]; - if (!locks.isEmpty()) { - Iterator it = locks.keySet().iterator(); - while (it.hasNext()) { - ItemId id = (ItemId) it.next(); - if (FineGrainedISMLocking.hasDependency(changes, id)) { - return true; - } + Map locks = slots[i]; + for (ItemId id : locks.keySet()) { + if (FineGrainedISMLocking.hasDependency(changes, id)) { + return true; } } }