--- 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
}