You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2011/02/01 16:06:15 UTC
svn commit: r1066061 - in /jackrabbit/branches/2.2: ./
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java
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<Sync> waitingReaders =
+ Collections.synchronizedList(new LinkedList<Sync>());
/**
* 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<Sync> waitingWriters = new LinkedList<Sync>();
/**
* {@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<Sync> 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<Sync> 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<ItemId, Integer>[] 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<ItemId, Integer>();
}
}
@@ -312,7 +326,7 @@ public class FineGrainedISMLocking imple
global = true;
return;
}
- Map locks = slots[slotIndex(id)];
+ Map<ItemId, Integer> 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<ItemId, Integer> 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<ItemId, Integer> locks = slots[i];
+ for (ItemId id : locks.keySet()) {
+ if (FineGrainedISMLocking.hasDependency(changes, id)) {
+ return true;
}
}
}