[infinispan-commits] Infinispan SVN: r650 - trunk/core/src/main/java/org/infinispan/container.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Tue Aug 11 08:42:42 EDT 2009


Author: manik.surtani at jboss.com
Date: 2009-08-11 08:42:41 -0400 (Tue, 11 Aug 2009)
New Revision: 650

Modified:
   trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java
Log:
Implemented a backoff

Modified: trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java	2009-08-11 11:51:40 UTC (rev 649)
+++ trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java	2009-08-11 12:42:41 UTC (rev 650)
@@ -10,6 +10,7 @@
 import java.util.Iterator;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.concurrent.locks.LockSupport;
 import java.util.concurrent.locks.ReentrantLock;
 
 /**
@@ -92,6 +93,21 @@
    // links and link management
 
    /**
+    * Back off
+    *
+    * @param nanos nanos to back off for.  If -1, starts at a default
+    * @return next time, back off for these nanos
+    */
+   private static final long backoffStart = 10000;
+
+   private long backoff(long nanos) {
+      long actualNanos = nanos < 0 ? backoffStart : nanos;
+      LockSupport.parkNanos(actualNanos);
+      long newNanos = actualNanos << 1;
+      return newNanos > 10000000 ? backoffStart : newNanos;
+   }
+
+   /**
     * Tests whether a given linked entry is marked for deletion.  In this implementation, being "marked" means that it
     * is of type Marker rather than LinkedEntry, but given the relative cost of an "instanceof" check, we prefer to test
     * the state of the InternalCacheEntry referenced by the LinkedEntry.  An InternalCacheEntry *always* exists so if it
@@ -229,18 +245,16 @@
     */
    protected final void linkAtEnd(LinkedEntry entry) {
       LinkedEntry prev = tail.p;
-//      long backOffNanos = 100000; // start at 0.1 millis
+      long backoffTime = -1;
       for (; ;) {
          entry.p = prev;
          entry.n = tail;
          if (prev.casNext(tail, entry)) break;
          prev = correctPrev(prev, tail);
-
-//         LockSupport.parkNanos(backOffNanos);
-//         backOffNanos <<= 1;
+         backoffTime = backoff(backoffTime);
       }
 
-//      backOffNanos = 100000; // start at 0.1 millis
+      backoffTime = -1;
       for (; ;) {
          LinkedEntry l1 = tail.p;
          if (isMarkedForRemoval(l1) || entry.n != tail) break;
@@ -248,8 +262,7 @@
             if (isMarkedForRemoval(entry.p)) entry = correctPrev(entry, tail);
             break;
          }
-//         LockSupport.parkNanos(backOffNanos);
-//         backOffNanos <<= 1;
+         backoffTime = backoff(backoffTime);
       }
    }
 
@@ -306,7 +319,7 @@
     */
    protected final LinkedEntry correctPrev(LinkedEntry suggestedPreviousEntry, LinkedEntry currentEntry) {
       LinkedEntry lastLink = null, link1, prev2;
-//      long backOffNanos = 100000; // start at 0.1 millis
+      long backoffTime = -1;
       while (true) {
          link1 = currentEntry.p;
          if (isMarkedForRemoval(link1)) break;
@@ -334,8 +347,7 @@
             if (isMarkedForRemoval(suggestedPreviousEntry.p)) continue;
             break;
          }
-//         LockSupport.parkNanos(backOffNanos);
-//         backOffNanos <<= 1;
+         backoffTime = backoff(backoffTime);
       }
       return suggestedPreviousEntry;
    }
@@ -615,7 +627,7 @@
          return FIFODataContainer.this.size();
       }
    }
-   
+
    protected final class Values extends AbstractCollection<Object> {
       public Iterator<Object> iterator() {
          return new ValueIterator();
@@ -625,7 +637,7 @@
          return FIFODataContainer.this.size();
       }
    }
-   
+
    protected final class EntrySet extends AbstractSet<InternalCacheEntry> {
       public Iterator<InternalCacheEntry> iterator() {
          return new ImmutableEntryIterator();
@@ -655,7 +667,7 @@
          return current.e;
       }
    }
-   
+
    protected final class ImmutableEntryIterator extends LinkedIterator implements Iterator<InternalCacheEntry> {
       public InternalCacheEntry next() {
          return Immutables.immutableInternalCacheEntry(current.e);
@@ -667,7 +679,7 @@
          return current.e.getKey();
       }
    }
-   
+
    protected final class ValueIterator extends LinkedIterator implements Iterator<Object> {
       public Object next() {
          return current.e.getValue();
@@ -798,7 +810,7 @@
    public Collection<Object> values() {
       return new Values();
    }
-   
+
    public Set<InternalCacheEntry> entrySet() {
       return new EntrySet();
    }



More information about the infinispan-commits mailing list