src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventConsumer.java
branchJEP-349-branch
changeset 57433 83e4343a6984
parent 57432 ba454a26d2c1
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventConsumer.java	Wed Jun 26 16:04:47 2019 +0200
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventConsumer.java	Thu Jun 27 10:19:32 2019 +0200
@@ -110,7 +110,7 @@
 
     protected boolean reuse = true;
 
-    protected InternalEventFilter eventFilter = InternalEventFilter.ACCEPT_ALL;
+    protected volatile InternalEventFilter eventFilter = InternalEventFilter.ACCEPT_ALL;
 
     private final AccessControlContext accessControlContext;
     private boolean started;
@@ -184,6 +184,7 @@
         }
         if (removeConsumer) {
             EventDispatcher[] array = list.toArray(new EventDispatcher[list.size()]);
+            eventFilter = buildFilter(array);
             consumersHandle.setVolatile(this, array);
             dispatcherHandle.setVolatile(this, new LongMap<>()); // will reset
                                                                  // dispatch
@@ -221,8 +222,22 @@
         add(new EventDispatcher(eventName, action));
     }
 
+    InternalEventFilter buildFilter(EventDispatcher[] dispatchers) {
+        InternalEventFilter ef = new InternalEventFilter();
+        for (EventDispatcher ed : dispatchers) {
+            String name = ed.eventName;
+            if (name == null) {
+                return InternalEventFilter.ACCEPT_ALL;
+            }
+            ef.setThreshold(name, 0);
+        }
+        return ef.threadSafe();
+    }
+
     private synchronized void add(EventDispatcher e) {
-        consumersHandle.setVolatile(this, merge(consumers, e));
+        EventDispatcher[] dispatchers = merge(consumers,e);
+        eventFilter = buildFilter(dispatchers);
+        consumersHandle.setVolatile(this, dispatchers);
         dispatcherHandle.setVolatile(this, new LongMap<>()); // will reset
     }