svn commit: r923094 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent: TTLObject.java test/AsyncTTLObjectTest.java test/SyncTTLObjectTest.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r923094 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent: TTLObject.java test/AsyncTTLObjectTest.java test/SyncTTLObjectTest.java

doogie-3
Author: doogie
Date: Mon Mar 15 07:21:59 2010
New Revision: 923094

URL: http://svn.apache.org/viewvc?rev=923094&view=rev
Log:
Reworked setObject to delay the actual setting until the next getObject
call.  Removes one hard to test branch.  Just a single branch left to
test.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLObject.java
    ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/AsyncTTLObjectTest.java
    ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/SyncTTLObjectTest.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLObject.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLObject.java?rev=923094&r1=923093&r2=923094&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLObject.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLObject.java Mon Mar 15 07:21:59 2010
@@ -80,7 +80,7 @@ public abstract class TTLObject<T> imple
         ExecutionPool.pulseAll();
     }
 
-    public enum State { INVALID, REGEN, REGENERATING, GENERATE, GENERATING, GENERATING_INITIAL, VALID, ERROR, ERROR_INITIAL }
+    public enum State { INVALID, REGEN, REGENERATING, GENERATE, GENERATING, GENERATING_INITIAL, VALID, ERROR, ERROR_INITIAL, SET }
     private volatile ValueAndState<T> object = new StandardValueAndState<T>(this, null, null, State.INVALID, 0, null, null);
     private static final AtomicReferenceFieldUpdater<TTLObject, ValueAndState> objectAccessor = AtomicReferenceFieldUpdater.newUpdater(TTLObject.class, ValueAndState.class, "object");
     private static final AtomicIntegerFieldUpdater<TTLObject> serialAccessor = AtomicIntegerFieldUpdater.newUpdater(TTLObject.class, "serial");
@@ -113,6 +113,10 @@ public abstract class TTLObject<T> imple
             return ttlObject.newValueAndState(value, null, State.VALID, serialAccessor.incrementAndGet(ttlObject), null, new Pulse(ttlObject));
         }
 
+        protected ValueAndState<T> set(T value) {
+            return ttlObject.newValueAndState(value, null, State.SET, serialAccessor.incrementAndGet(ttlObject), null, null);
+        }
+
         protected ValueAndState<T> submit(final T oldValue, State state) {
             return ttlObject.newValueAndState(getValue(), createTask(oldValue), state, serial, null, null);
         }
@@ -184,6 +188,8 @@ public abstract class TTLObject<T> imple
                 nextContainer = container.refresh(State.INVALID);
             } else if (container.state == State.ERROR || container.state == State.VALID) {
                 nextContainer = container.refresh(getForeground() ? State.GENERATE : State.REGEN);
+            } else if (container.state == State.SET) {
+                nextContainer = container.refresh(getForeground() ? State.GENERATE : State.REGEN);
             } else {
                 return;
             }
@@ -201,14 +207,10 @@ public abstract class TTLObject<T> imple
     }
 
     protected final void setObject(T newObject) {
-        ValueAndState<T> container, nextContainer;
-        State nextState;
-        do {
-            container = getContainer();
-            nextContainer = container.valid(newObject);
-        } while (!objectAccessor.compareAndSet(this, container, nextContainer));
+        ValueAndState<T> container = getContainer();
+        ValueAndState<T> nextContainer = container.set(newObject);
+        objectAccessor.compareAndSet(this, container, nextContainer);
         cancelFuture(container);
-        ExecutionPool.addPulse(nextContainer.pulse);
     }
 
     private void cancelFuture(ValueAndState<T> container) {
@@ -231,6 +233,8 @@ public abstract class TTLObject<T> imple
                         return container.getValue();
                     } else if (container.state == State.INVALID) {
                         nextContainer = container.submit(getInitial(), State.GENERATING_INITIAL);
+                    } else if (container.state == State.SET) {
+                        nextContainer = container.valid(container.getValue());
                     } else if (container.state == State.REGENERATING || container.state == State.GENERATING || container.state == State.GENERATING_INITIAL) {
                         if (container.state == State.REGENERATING && !container.future.isDone()) {
                             return container.getValue();

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/AsyncTTLObjectTest.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/AsyncTTLObjectTest.java?rev=923094&r1=923093&r2=923094&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/AsyncTTLObjectTest.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/AsyncTTLObjectTest.java Mon Mar 15 07:21:59 2010
@@ -69,6 +69,16 @@ public class AsyncTTLObjectTest extends
         assertGetObject("Refreshed with old data", "b", 3, 0, 100000000);
         Thread.sleep(350);
         assertGetObject("Refreshed with old data", "4", 5, 0, 100000000);
+        object.set("5");
+        assertGetObject("set new data", "5", 5, 0, 100000000);
+        TTLObject.pulseAll();
+        sleepTime = 200;
+        loadData = "c";
+        object.set("5");
+        object.refresh();
+        assertGetObject("refresh after set", "5", 5, 0, 100000000);
+        Thread.sleep(300);
+        assertGetObject("refresh after set", "c", 6, 0, 100000000);
     }
 
     public void testSet() throws Exception {

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/SyncTTLObjectTest.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/SyncTTLObjectTest.java?rev=923094&r1=923093&r2=923094&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/SyncTTLObjectTest.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/SyncTTLObjectTest.java Mon Mar 15 07:21:59 2010
@@ -125,6 +125,13 @@ public class SyncTTLObjectTest extends T
         assertEquals("two dones", 3, doneCount.get());
         object.getObject();
         assertEquals("two dones", 4, doneCount.get());
+        object.set("one");
+        assertEquals("one", "one", object.getObject());
+        assertEquals("two dones", 4, doneCount.get());
+        object.set("two");
+        object.refresh();
+        assertEquals("two", (String) null, object.getObject());
+        assertEquals("two dones", 5, doneCount.get());
     }
 
     public void testGetTTL() throws Exception {