Author: csierra
Date: Tue Oct 10 15:50:41 2017
New Revision: 1811719

URL: http://svn.apache.org/viewvc?rev=1811719&view=rev
Log:
[Component-DSL] Add closed status to the tuple

Modified:
    
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/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=1811719&r1=1811718&r2=1811719&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:50:41 2017
@@ -35,6 +35,7 @@ class Tuple<T> implements Event<T> {
        private Deque<Runnable> _closingHandlers = new LinkedList<>();
        private DoublyLinkedList<Tuple<?>> _relatedTuples =
                new DoublyLinkedList<>();
+       private AtomicBoolean closed = new AtomicBoolean(false);
 
        private Tuple(T t) {
                this(t, new LinkedList<>());
@@ -45,13 +46,15 @@ class Tuple<T> implements Event<T> {
                _closingHandlers = closingHandlers;
        }
 
-       public DoublyLinkedList.Node<Tuple<?>> addRelatedTuple(Tuple<?> tuple) {
+       public void addRelatedTuple(Tuple<?> tuple) {
+               if (closed.get()) {
+                       return;
+               }
+
                DoublyLinkedList.Node<Tuple<?>> tupleNode = 
_relatedTuples.addLast(
                        tuple);
 
                tuple.onTermination(tupleNode::remove);
-
-               return tupleNode;
        }
 
        public static <T> Tuple<T> create(T t) {
@@ -70,12 +73,11 @@ class Tuple<T> implements Event<T> {
 
        @Override
        public boolean equals(Object o) {
-               if (this == o) return true;
-               if (o == null || getClass() != o.getClass()) return false;
-
-               Tuple<?> tuple = (Tuple<?>) o;
+               return this == o;
+       }
 
-               return t.equals(tuple.t);
+       public boolean isClosed() {
+               return closed.get();
        }
 
        public <S> Tuple<S> map(Function<? super T, ? extends S> fun) {
@@ -83,10 +85,18 @@ class Tuple<T> implements Event<T> {
        }
 
        public void onTermination(Runnable terminator) {
+               if (closed.get()) {
+                       return;
+               }
+
                _closingHandlers.push(terminator);
        }
 
        public void terminate() {
+               if (!closed.compareAndSet(false, true)) {
+                       return;
+               }
+
                Iterator<Tuple<?>> iterator = _relatedTuples.iterator();
 
                while (iterator.hasNext()) {


Reply via email to