src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/Dispatcher.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     1
/*
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     4
 *
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    10
 *
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    15
 * accompanied this code).
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    16
 *
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    20
 *
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    23
 * questions.
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    24
 */
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    25
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    26
package jdk.jfr.internal.consumer;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    27
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    28
import java.time.Instant;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    29
import java.util.ArrayList;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    30
import java.util.List;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    31
import java.util.function.Consumer;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    32
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    33
import jdk.jfr.EventType;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    34
import jdk.jfr.consumer.RecordedEvent;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    35
import jdk.jfr.internal.LongMap;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    36
import jdk.jfr.internal.consumer.ChunkParser.ParserConfiguration;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    37
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    38
final class Dispatcher {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    39
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    40
    final static class EventDispatcher {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    41
        private final static EventDispatcher[] NO_DISPATCHERS = new EventDispatcher[0];
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    42
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    43
        private final String eventName;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    44
        private final Consumer<RecordedEvent> action;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    45
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    46
        public EventDispatcher(String eventName, Consumer<RecordedEvent> action) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    47
            this.eventName = eventName;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    48
            this.action = action;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    49
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    50
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    51
        private void offer(RecordedEvent event) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    52
            action.accept(event);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    53
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    54
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    55
        private boolean accepts(EventType eventType) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    56
            return (eventName == null || eventType.getName().equals(eventName));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    57
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    58
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    59
        public Consumer<RecordedEvent> getAction() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    60
            return action;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    61
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    62
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    63
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    64
    private final Consumer<Throwable>[] errorActions;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    65
    private final Runnable[] flushActions;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    66
    private final Runnable[] closeActions;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    67
    private final EventDispatcher[] dispatchers;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    68
    private final LongMap<EventDispatcher[]> dispatcherLookup = new LongMap<>();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    69
    final ParserConfiguration parserConfiguration;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    70
    final Instant startTime;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    71
    final Instant endTime;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    72
    final long startNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    73
    final long endNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    74
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    75
    // Cache
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    76
    private EventType cacheEventType;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    77
    private EventDispatcher[] cacheDispatchers;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    78
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    79
    @SuppressWarnings({"rawtypes", "unchecked"})
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    80
    public Dispatcher(StreamConfiguration c) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    81
        this.flushActions = c.flushActions.toArray(new Runnable[0]);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    82
        this.closeActions = c.closeActions.toArray(new Runnable[0]);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    83
        this.errorActions = c.errorActions.toArray(new Consumer[0]);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    84
        this.dispatchers = c.eventActions.toArray(new EventDispatcher[0]);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    85
        this.parserConfiguration = new ParserConfiguration(0, Long.MAX_VALUE, c.reuse, c.ordered, buildFilter(dispatchers));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    86
        this.startTime = c.startTime;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    87
        this.endTime = c.endTime;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    88
        this.startNanos = c.startNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    89
        this.endNanos = c.endNanos;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    90
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    91
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    92
    public void runFlushActions() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    93
        Runnable[] flushActions = this.flushActions;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    94
        for (int i = 0; i < flushActions.length; i++) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    95
            try {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    96
                flushActions[i].run();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    97
            } catch (Exception e) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    98
                handleError(e);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
    99
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   100
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   101
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   102
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   103
    public void runCloseActions() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   104
        Runnable[] closeActions = this.closeActions;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   105
        for (int i = 0; i < closeActions.length; i++) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   106
            try {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   107
                closeActions[i].run();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   108
            } catch (Exception e) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   109
                handleError(e);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   110
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   111
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   112
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   113
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   114
    private static ParserFilter buildFilter(EventDispatcher[] dispatchers) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   115
        ParserFilter ef = new ParserFilter();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   116
        for (EventDispatcher ed : dispatchers) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   117
            String name = ed.eventName;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   118
            if (name == null) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   119
                return ParserFilter.ACCEPT_ALL;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   120
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   121
            ef.setThreshold(name, 0);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   122
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   123
        return ef;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   124
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   125
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   126
    void dispatch(RecordedEvent event) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   127
        EventType type = event.getEventType();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   128
        EventDispatcher[] dispatchers = null;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   129
        if (type == cacheEventType) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   130
            dispatchers = cacheDispatchers;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   131
        } else {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   132
            dispatchers = dispatcherLookup.get(type.getId());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   133
            if (dispatchers == null) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   134
                List<EventDispatcher> list = new ArrayList<>();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   135
                for (EventDispatcher e : this.dispatchers) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   136
                    if (e.accepts(type)) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   137
                        list.add(e);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   138
                    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   139
                }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   140
                dispatchers = list.isEmpty() ? EventDispatcher.NO_DISPATCHERS : list.toArray(new EventDispatcher[0]);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   141
                dispatcherLookup.put(type.getId(), dispatchers);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   142
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   143
            cacheDispatchers = dispatchers;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   144
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   145
        // Expected behavior if exception occurs in onEvent:
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   146
        //
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   147
        // Synchronous:
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   148
        //  - User has added onError action:
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   149
        //     Catch exception, call onError and continue with next event
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   150
        //     Let Errors propagate to caller of EventStream::start
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   151
        //  - Default action
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   152
        //     Catch exception, e.printStackTrace() and continue with next event
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   153
        //     Let Errors propagate to caller of EventStream::start
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   154
        //
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   155
        // Asynchronous
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   156
        //  - User has added onError action
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   157
        //     Catch exception, call onError and continue with next event
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   158
        //     Let Errors propagate, shutdown thread and stream
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   159
        //  - Default action
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   160
        //    Catch exception, e.printStackTrace() and continue with next event
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   161
        //    Let Errors propagate and shutdown thread and stream
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   162
        //
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   163
        for (int i = 0; i < dispatchers.length; i++) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   164
            try {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   165
                dispatchers[i].offer(event);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   166
            } catch (Exception e) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   167
                handleError(e);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   168
            }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   169
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   170
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   171
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   172
    private void handleError(Throwable e) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   173
        Consumer<?>[] consumers = this.errorActions;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   174
        if (consumers.length == 0) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   175
            defaultErrorHandler(e);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   176
            return;
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   177
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   178
        for (int i = 0; i < consumers.length; i++) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   179
            @SuppressWarnings("unchecked")
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   180
            Consumer<Throwable> consumer = (Consumer<Throwable>) consumers[i];
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   181
            consumer.accept(e);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   182
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   183
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   184
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   185
    private void defaultErrorHandler(Throwable e) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   186
        e.printStackTrace();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   187
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents:
diff changeset
   188
}