src/jdk.jfr/share/classes/jdk/jfr/consumer/StreamConfiguration.java
author egahlin
Fri, 13 Sep 2019 18:46:07 +0200
branchJEP-349-branch
changeset 58129 7b751fe181a5
parent 58020 f082177c5023
permissions -rw-r--r--
Restructure stream configuration
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     1
package jdk.jfr.consumer;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     2
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     3
import java.time.Instant;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     4
import java.util.ArrayList;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     5
import java.util.List;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     6
import java.util.function.Consumer;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     7
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
     8
import jdk.jfr.consumer.Dispatcher.EventDispatcher;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
     9
import jdk.jfr.internal.Utils;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    10
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    11
final class StreamConfiguration {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    12
    final List<Runnable> closeActions = new ArrayList<>();
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    13
    final List<Runnable> flushActions = new ArrayList<>();
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    14
    final List<EventDispatcher> eventActions = new ArrayList<>();
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    15
    final List<Consumer<Throwable>> errorActions = new ArrayList<>();
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    16
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    17
    boolean reuse = true;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    18
    boolean ordered = true;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    19
    Instant startTime = null;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    20
    Instant endTime = null;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    21
    boolean started = false;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    22
    long startNanos = 0;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    23
    long endNanos = Long.MAX_VALUE;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    24
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    25
    volatile boolean changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    26
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    27
    public synchronized boolean remove(Object action) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    28
        boolean removed = false;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    29
        removed |= flushActions.removeIf(e -> e == action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    30
        removed |= closeActions.removeIf(e -> e == action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    31
        removed |= errorActions.removeIf(e -> e == action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    32
        removed |= eventActions.removeIf(e -> e.action == action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    33
        if (removed) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    34
            changed = true;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    35
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    36
        return removed;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    37
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    38
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    39
    public synchronized void addEventAction(String name, Consumer<RecordedEvent> consumer) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    40
        eventActions.add(new EventDispatcher(name, consumer));
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    41
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    42
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    43
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    44
    public void addEventAction(Consumer<RecordedEvent> action) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    45
        addEventAction(null, action);
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    46
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    47
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    48
    public synchronized void addFlushAction(Runnable action) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    49
        flushActions.add(action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    50
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    51
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    52
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    53
    public synchronized void addCloseAction(Runnable action) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    54
        closeActions.add(action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    55
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    56
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    57
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    58
    public synchronized void addErrorAction(Consumer<Throwable> action) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    59
        errorActions.add(action);
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    60
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    61
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    62
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    63
    public synchronized void setReuse(boolean reuse) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    64
        this.reuse = reuse;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    65
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    66
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    67
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    68
    public synchronized void setOrdered(boolean ordered) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    69
        this.ordered = ordered;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    70
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    71
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    72
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    73
    public synchronized void setEndTime(Instant endTime) {
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    74
        this.endTime = endTime;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    75
        this.endNanos = Utils.timeToNanos(endTime);
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    76
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    77
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    78
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    79
    public synchronized void setStartTime(Instant startTime) {
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    80
        this.startTime = startTime;
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    81
        this.startNanos = Utils.timeToNanos(startTime);
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    82
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    83
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    84
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    85
    public synchronized void setStartNanos(long startNanos) {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    86
        this.startNanos = startNanos;
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    87
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    88
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    89
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    90
    public synchronized void setStarted(boolean started) {
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    91
        this.started = started;
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    92
        changed = true;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    93
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    94
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    95
    public boolean hasChanged() {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    96
        return changed;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    97
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
    98
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
    99
    public synchronized void clearChanged() {
7b751fe181a5 Restructure stream configuration
egahlin
parents: 58020
diff changeset
   100
        changed = false;
58020
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
   101
    }
f082177c5023 Improved handling of Thread.interrupt() + cleanup
egahlin
parents:
diff changeset
   102
}