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()) {