You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2017/11/03 15:25:01 UTC

[02/11] aries-jax-rs-whiteboard git commit: Update router semantics

Update router semantics


Project: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/commit/02e50f07
Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/02e50f07
Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/02e50f07

Branch: refs/heads/master
Commit: 02e50f07838a3ef3312f059b3ad25830f608de46
Parents: ff21399
Author: Carlos Sierra <cs...@apache.org>
Authored: Thu Oct 26 06:33:59 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Fri Nov 3 16:18:23 2017 +0100

----------------------------------------------------------------------
 .../aries/jax/rs/whiteboard/internal/Utils.java | 44 +++++++++++---------
 1 file changed, 24 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/02e50f07/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
index b373e20..ea1766b 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
@@ -36,6 +36,8 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -284,31 +286,28 @@ public class Utils {
             return _serviceReference;
         }
 
-
-
     }
 
     private static class HighestRankedRouter<T extends Comparable<? super T>>
         implements Consumer<OSGi.Router<T>> {
 
-        private final TreeSet<Event<T>> _set;
         private final Comparator<Event<T>> _comparator;
-        private SentEvent _sent;
 
         public HighestRankedRouter() {
             _comparator = Comparator.comparing(Event::getContent);
-
-            _set = new TreeSet<>(_comparator);
         }
 
         @Override
         public void accept(OSGi.Router<T> router) {
+            AtomicReference<SentEvent<T>> _sent = new AtomicReference<>();
+            final TreeSet<Event<T>> _set = new TreeSet<>(_comparator);
+
             router.onIncoming(ev -> {
                 synchronized (_set) {
                     _set.add(ev);
 
                     if (ev == _set.last()) {
-                        _sent = router.signalAdd(ev);
+                        _sent.set(router.signalAdd(ev));
                     }
                 }
             });
@@ -320,22 +319,19 @@ public class Utils {
 
                     _set.remove(ev);
 
-                    if (_sent != null && _sent.getEvent() == ev) {
-                        _sent = null;
+                    SentEvent<T> sent = _sent.get();
+
+                    if (sent != null && sent.getEvent() == ev) {
+                        sent.terminate();
+
+                        _sent.set(null);
                     }
 
                     if (!_set.isEmpty()) {
-                        _sent = router.signalAdd(_set.last());
+                        _sent.set(router.signalAdd(_set.last()));
                     }
                 }
             });
-            router.onClose(() -> {
-                if (_sent != null) {
-                    _sent.terminate();
-                }
-
-                _sent = null;
-            });
         }
 
     }
@@ -344,11 +340,8 @@ public class Utils {
         implements Consumer<OSGi.Router<T>> {
 
         private final Function<T, K> _keySupplier;
-        private final ConcurrentHashMap<K, TreeSet<Event<T>>> _map =
-            new ConcurrentHashMap<>();
         private final Consumer<T> _onAddingShadowed;
         private final Consumer<T> _onRemovedShadowed;
-        private final Map<K, SentEvent<T>> _sentEvents = new HashMap<>();
 
         public HighestPerRouter(
             Function<T, K> keySupplier,
@@ -361,6 +354,15 @@ public class Utils {
 
         @Override
         public void accept(OSGi.Router<T> router) {
+            /**
+             * These can't be fields on the class or they would be shared among
+             * invocations to OSGiResult.run :-O
+             */
+            final ConcurrentHashMap<K, TreeSet<Event<T>>> _map =
+                new ConcurrentHashMap<>();
+
+            final Map<K, SentEvent<T>> _sentEvents = new HashMap<>();
+
             router.onIncoming(e -> {
                 K key = _keySupplier.apply(e.getContent());
 
@@ -413,6 +415,8 @@ public class Utils {
 
                         _sentEvents.compute(key, (___, sentEvent) -> {
                             if (sentEvent.getEvent() == e) {
+                                sentEvent.terminate();
+
                                 if (!set.isEmpty()) {
                                     Event<T> last = set.last();