You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2012/05/10 11:52:03 UTC
svn commit: r1336567 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
Author: mduerig
Date: Thu May 10 09:52:03 2012
New Revision: 1336567
URL: http://svn.apache.org/viewvc?rev=1336567&view=rev
Log:
OAK-93: Tree has wrong parent after move
- proper synchronization
- weak ref. children
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java?rev=1336567&r1=1336566&r2=1336567&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java Thu May 10 09:52:03 2012
@@ -18,6 +18,7 @@
*/
package org.apache.jackrabbit.oak.core;
+import org.apache.commons.collections.map.ReferenceMap;
import org.apache.jackrabbit.oak.api.CoreValue;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
@@ -30,10 +31,12 @@ import org.apache.jackrabbit.oak.spi.sta
import org.apache.jackrabbit.oak.util.Function1;
import org.apache.jackrabbit.oak.util.Iterators;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Implementation of tree based on {@link NodeStateBuilder}s. Each subtree
@@ -62,8 +65,7 @@ public class TreeImpl implements Tree {
/** Name of this tree */
private String name;
- // FIXME: should be synchronized, and weak refs
- private final Map<String, TreeImpl> children = new HashMap<String, TreeImpl>();
+ private final Children children = new Children();
private TreeImpl(NodeStore store, NodeState baseState, NodeStateBuilder rootBuilder,
TreeImpl parent, String name, Listener listener) {
@@ -501,4 +503,47 @@ public class TreeImpl implements Tree {
return !isDirty[0];
}
+ private static class Children {
+ @SuppressWarnings("unchecked")
+ private final Map<String, TreeImpl> children = new ReferenceMap();
+ private final Lock readLock;
+ private final Lock writeLock;
+
+ {
+ ReadWriteLock lock = new ReentrantReadWriteLock();
+ readLock = lock.readLock();
+ writeLock = lock.writeLock();
+ }
+
+ public void put(String name, TreeImpl tree) {
+ writeLock.lock();
+ try {
+ children.put(name, tree);
+ }
+ finally {
+ writeLock.unlock();
+ }
+ }
+
+ public TreeImpl get(String name) {
+ readLock.lock();
+ try {
+ return children.get(name);
+ }
+ finally {
+ readLock.unlock();
+ }
+ }
+
+ public void remove(String name) {
+ writeLock.lock();
+ try {
+ children.remove(name);
+ }
+ finally {
+ writeLock.unlock();
+ }
+ }
+ }
+
}