[infinispan-commits] Infinispan SVN: r282 - in trunk/core/src: main/java/org/infinispan/container/entries and 1 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Wed May 13 10:18:00 EDT 2009
Author: manik.surtani at jboss.com
Date: 2009-05-13 10:18:00 -0400 (Wed, 13 May 2009)
New Revision: 282
Modified:
trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java
trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java
trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java
trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java
Log:
More accurate atomic hash maps
Modified: trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java 2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java 2009-05-13 14:18:00 UTC (rev 282)
@@ -46,6 +46,7 @@
FastCopyHashMap<K, V> delegate;
private AtomicHashMapDelta delta = null;
private volatile AtomicHashMapProxy proxy;
+ volatile boolean copied = false;
/**
* Construction only allowed through this factory method. This factory is intended for use internally by the
@@ -62,8 +63,14 @@
delegate = new FastCopyHashMap<K, V>();
}
+ public AtomicHashMap(boolean isCopy) {
+ this();
+ copied = isCopy;
+ }
+
public void commit() {
- if (delta != null) delta = null;
+ copied = false;
+ delta = null;
}
public int size() {
@@ -107,7 +114,7 @@
public V remove(Object key) {
V oldValue = delegate.remove(key);
- RemoveOperation<K, V> op = new RemoveOperation<K, V>((K)key, oldValue);
+ RemoveOperation<K, V> op = new RemoveOperation<K, V>((K) key, oldValue);
getDelta().addOperation(op);
return oldValue;
}
@@ -120,7 +127,7 @@
public void clear() {
FastCopyHashMap<K, V> originalEntries = (FastCopyHashMap<K, V>) delegate.clone();
ClearOperation<K, V> op = new ClearOperation<K, V>(originalEntries);
- if (delta!= null ) delta.addOperation(op);
+ if (delta != null) delta.addOperation(op);
delegate.clear();
}
@@ -148,6 +155,7 @@
AtomicHashMap clone = (AtomicHashMap) super.clone();
clone.delegate = (FastCopyHashMap) delegate.clone();
clone.proxy = proxy;
+ clone.copied = true;
return clone;
}
catch (CloneNotSupportedException e) {
Modified: trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java 2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java 2009-05-13 14:18:00 UTC (rev 282)
@@ -22,9 +22,9 @@
package org.infinispan.atomic;
import org.infinispan.Cache;
-import org.infinispan.atomic.AtomicMap;
import org.infinispan.batch.AutoBatchSupport;
import org.infinispan.batch.BatchContainer;
+import org.infinispan.container.entries.CacheEntry;
import org.infinispan.context.Flag;
import org.infinispan.context.InvocationContext;
import org.infinispan.context.InvocationContextContainer;
@@ -61,8 +61,12 @@
}
private AtomicHashMap<K, V> getDeltaMapForWrite(InvocationContext ctx) {
- if (ctx.hasLockedKey(deltaMapKey)) {
- return (AtomicHashMap<K, V>) cache.get(deltaMapKey);
+ CacheEntry lookedUpEntry = ctx.lookupEntry(deltaMapKey);
+ boolean lockedAndCopied = lookedUpEntry != null && lookedUpEntry.isChanged() &&
+ ((AtomicHashMap) lookedUpEntry.getValue()).copied;
+
+ if (lockedAndCopied) {
+ return getDeltaMapForRead();
} else {
// acquire WL
boolean suppressLocks = ctx.hasFlag(Flag.SKIP_LOCKING);
@@ -77,7 +81,7 @@
AtomicHashMap map = getDeltaMapForRead();
// copy for write
- AtomicHashMap copy = map == null ? new AtomicHashMap() : map.copyForWrite();
+ AtomicHashMap copy = map == null ? new AtomicHashMap(true) : map.copyForWrite();
copy.initForWriting();
// reinstate the flag
if (suppressLocks) ctx.setFlags(Flag.SKIP_LOCKING);
Modified: trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java 2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java 2009-05-13 14:18:00 UTC (rev 282)
@@ -21,6 +21,7 @@
*/
package org.infinispan.container.entries;
+import org.infinispan.atomic.AtomicHashMap;
import org.infinispan.container.DataContainer;
import static org.infinispan.container.entries.ReadCommittedEntry.Flags.*;
import org.infinispan.util.logging.Log;
@@ -150,6 +151,10 @@
if (trace)
log.trace("Updating entry (key={0} removed={1} valid={2} changed={3} created={4} value={5}]", getKey(),
isRemoved(), isValid(), isChanged(), isCreated(), value);
+
+ // Ugh!
+ if (value instanceof AtomicHashMap) ((AtomicHashMap) value).commit();
+
if (isRemoved()) {
container.remove(key);
} else {
Modified: trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java 2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java 2009-05-13 14:18:00 UTC (rev 282)
@@ -25,8 +25,6 @@
import org.easymock.EasyMock;
import org.testng.annotations.Test;
-import org.infinispan.atomic.AtomicHashMap;
-import org.infinispan.atomic.AtomicHashMapDelta;
import java.io.IOException;
import java.io.ObjectOutput;
More information about the infinispan-commits
mailing list