Author: csierra
Date: Tue Oct 10 15:51:38 2017
New Revision: 1811725

URL: http://svn.apache.org/viewvc?rev=1811725&view=rev
Log:
[Component-DSL] Tuple refactoring

To eliminate unnecesary state mutation.

Modified:
    
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/OSGiImpl.java
    
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/Tuple.java

Modified: 
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/OSGiImpl.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/OSGiImpl.java?rev=1811725&r1=1811724&r2=1811725&view=diff
==============================================================================
--- 
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/OSGiImpl.java
 (original)
+++ 
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/OSGiImpl.java
 Tue Oct 10 15:51:38 2017
@@ -84,7 +84,16 @@ public class OSGiImpl<T> implements OSGi
        @Override
        public OSGiResult run(BundleContext bundleContext, Consumer<T> andThen) 
{
                OSGiResultImpl osgiResult =
-                       _operation.run(bundleContext, t -> 
andThen.accept(t._t));
+                       _operation.run(
+                               bundleContext,
+                               t -> {
+                                       if (!t.isClosed()) {
+                                               andThen.accept(t._t);
+                                       }
+                                       if (t.isClosed()) {
+                                               t.terminate();
+                                       }
+                               });
 
                osgiResult.start();
 

Modified: 
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/Tuple.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/Tuple.java?rev=1811725&r1=1811724&r2=1811725&view=diff
==============================================================================
--- 
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/Tuple.java
 (original)
+++ 
aries/trunk/component-dsl/component-dsl/src/main/java/org/apache/aries/osgi/functional/internal/Tuple.java
 Tue Oct 10 15:51:38 2017
@@ -33,39 +33,21 @@ import java.util.function.Function;
 class Tuple<T> implements Event<T>, SentEvent<T> {
 
        public final T _t;
-       private final Deque<Runnable> _closingHandlers;
-       private final DoublyLinkedList<Tuple<?>> _relatedTuples;
-       private final AtomicBoolean closed = new AtomicBoolean(false);
+       private final Deque<Runnable> _closingHandlers = new LinkedList<>();
+       private final DoublyLinkedList<Tuple<?>> _relatedTuples = new 
DoublyLinkedList<>();
+       private volatile boolean closed = false;
        private Tuple<T> _cause = this;
 
        private Tuple(T t) {
-               this(t, new LinkedList<>(), new DoublyLinkedList<>());
-       }
-
-       private Tuple(
-               T t, Deque<Runnable> closingHandlers,
-               DoublyLinkedList<Tuple<?>> relatedTuples) {
-
                _t = t;
-               _closingHandlers = closingHandlers;
-               _relatedTuples = relatedTuples;
        }
 
-       private Tuple(
-               T t, Deque<Runnable> closingHandlers,
-               DoublyLinkedList<Tuple<?>> relatedTuples,
-               Tuple<T> cause) {
-
-               this(t, closingHandlers, relatedTuples);
-
+       private Tuple(T t, Tuple<T> cause) {
+               this(t);
                _cause = cause;
        }
 
        public void addRelatedTuple(Tuple<?> tuple) {
-               if (closed.get()) {
-                       return;
-               }
-
                DoublyLinkedList.Node<Tuple<?>> tupleNode = 
_relatedTuples.addLast(
                        tuple);
 
@@ -92,18 +74,18 @@ class Tuple<T> implements Event<T>, Sent
        }
 
        public boolean isClosed() {
-               return closed.get();
+               return closed;
        }
 
        public <S> Tuple<S> map(Function<? super T, ? extends S> fun) {
-               return new Tuple<>(fun.apply(_t), _closingHandlers, 
_relatedTuples);
+               Tuple<S> tuple = new Tuple<>(fun.apply(_t));
+
+               addRelatedTuple(tuple);
+
+               return tuple;
        }
 
        public void onTermination(Runnable terminator) {
-               if (closed.get()) {
-                       return;
-               }
-
                _closingHandlers.push(terminator);
        }
 
@@ -113,8 +95,7 @@ class Tuple<T> implements Event<T>, Sent
        }
 
        public Tuple<T> copy() {
-               Tuple<T> copy = new Tuple<>(
-                       _t, new LinkedList<>(), new DoublyLinkedList<>(), this);
+               Tuple<T> copy = new Tuple<>(_t, this);
 
                addRelatedTuple(copy);
 
@@ -122,9 +103,7 @@ class Tuple<T> implements Event<T>, Sent
        }
 
        public void terminate() {
-               if (!closed.compareAndSet(false, true)) {
-                       return;
-               }
+               closed = true;
 
                Iterator<Tuple<?>> iterator = _relatedTuples.iterator();
 


Reply via email to