Skip to content

Commit 1cac642

Browse files
authored
Add support for fine-tuned phase tracking (#70)
1 parent bb81df7 commit 1cac642

File tree

6 files changed

+60
-10
lines changed

6 files changed

+60
-10
lines changed

eventbus-test-jar/src/main/java/net/minecraftforge/eventbus/testjar/benchmarks/ModLauncherBenchmarks.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package net.minecraftforge.eventbus.testjar.benchmarks;
77

88
import net.minecraftforge.eventbus.api.BusBuilder;
9+
import net.minecraftforge.eventbus.api.EventPriority;
910
import net.minecraftforge.eventbus.api.IEventBus;
1011
import net.minecraftforge.eventbus.testjar.events.CancelableEvent;
1112
import net.minecraftforge.eventbus.testjar.events.EventWithData;
@@ -28,7 +29,7 @@ private ModLauncherBenchmarks() {}
2829

2930
public static final class Post {
3031
private Post() {}
31-
private static final IEventBus EVENT_BUS = BusBuilder.builder().useModLauncher().build();
32+
private static final IEventBus EVENT_BUS = BusBuilder.builder().useModLauncher().setPhasesToTrack(EventPriority.MONITOR).build();
3233

3334
public static void setup(int multiplier, Supplier<Consumer<IEventBus>> registrar) {
3435
for (int i = 0; i < multiplier; i++)

eventbus-test-jar/src/main/java/net/minecraftforge/eventbus/testjar/benchmarks/NoLoaderBenchmarks.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package net.minecraftforge.eventbus.testjar.benchmarks;
77

88
import net.minecraftforge.eventbus.api.BusBuilder;
9+
import net.minecraftforge.eventbus.api.EventPriority;
910
import net.minecraftforge.eventbus.api.IEventBus;
1011
import net.minecraftforge.eventbus.testjar.events.CancelableEvent;
1112
import net.minecraftforge.eventbus.testjar.events.EventWithData;
@@ -28,7 +29,7 @@ private NoLoaderBenchmarks() {}
2829

2930
public static final class Post {
3031
private Post() {}
31-
private static final IEventBus EVENT_BUS = BusBuilder.builder().build();
32+
private static final IEventBus EVENT_BUS = BusBuilder.builder().setPhasesToTrack(EventPriority.MONITOR).build();
3233

3334
public static void setup(int multiplier, Supplier<Consumer<IEventBus>> registrar) {
3435
for (int i = 0; i < multiplier; i++)

src/main/java/net/minecraftforge/eventbus/BusBuilderImpl.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@
44
*/
55
package net.minecraftforge.eventbus;
66

7-
import net.minecraftforge.eventbus.api.BusBuilder;
8-
import net.minecraftforge.eventbus.api.Event;
9-
import net.minecraftforge.eventbus.api.IEventBus;
10-
import net.minecraftforge.eventbus.api.IEventExceptionHandler;
7+
import net.minecraftforge.eventbus.api.*;
8+
9+
import java.util.EnumSet;
1110

1211
/**
1312
* BusBuilder Implementation, public for BusBuilder.builder() only, don't use this directly.
1413
*/
1514
public final class BusBuilderImpl implements BusBuilder {
15+
static final EnumSet<EventPriority> ALL_PHASES = EnumSet.allOf(EventPriority.class);
16+
static final EnumSet<EventPriority> NO_PHASES = EnumSet.noneOf(EventPriority.class);
17+
private static final EnumSet<EventPriority> MONITOR_ONLY = EnumSet.of(EventPriority.MONITOR);
18+
1619
IEventExceptionHandler exceptionHandler;
1720
boolean trackPhases = true;
21+
EnumSet<EventPriority> phasesToTrack = ALL_PHASES;
1822
boolean startShutdown = false;
1923
boolean checkTypesOnDispatch = false;
2024
Class<?> markerType = Event.class;
@@ -23,9 +27,29 @@ public final class BusBuilderImpl implements BusBuilder {
2327
@Override
2428
public BusBuilder setTrackPhases(boolean trackPhases) {
2529
this.trackPhases = trackPhases;
30+
this.phasesToTrack = trackPhases ? ALL_PHASES : NO_PHASES;
2631
return this;
2732
}
2833

34+
@Override
35+
public BusBuilder setPhasesToTrack(EnumSet<EventPriority> phases) {
36+
if (phases.isEmpty()) {
37+
this.trackPhases = false;
38+
this.phasesToTrack = NO_PHASES;
39+
} else {
40+
this.trackPhases = true;
41+
this.phasesToTrack = phases;
42+
}
43+
return this;
44+
}
45+
46+
@Override
47+
public BusBuilder setPhasesToTrack(EventPriority phase) {
48+
return phase == EventPriority.MONITOR
49+
? setPhasesToTrack(BusBuilderImpl.MONITOR_ONLY)
50+
: setPhasesToTrack(EnumSet.of(phase));
51+
}
52+
2953
@Override
3054
public BusBuilder setExceptionHandler(IEventExceptionHandler handler) {
3155
this.exceptionHandler = handler;

src/main/java/net/minecraftforge/eventbus/EventBus.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public class EventBus implements IEventExceptionHandler, IEventBus {
2525
private static final Logger LOGGER = LogManager.getLogger();
2626
private static final boolean checkTypesOnDispatchProperty = Boolean.parseBoolean(System.getProperty("eventbus.checkTypesOnDispatch", "false"));
2727
private static final AtomicInteger maxID = new AtomicInteger(0);
28+
2829
private final boolean trackPhases;
30+
final EnumSet<EventPriority> phasesToTrack;
2931

3032
private final ConcurrentHashMap<Object, List<IEventListener>> listeners = new ConcurrentHashMap<>();
3133
private final int busID = maxID.getAndIncrement();
@@ -41,24 +43,26 @@ private EventBus() {
4143
ListenerList.resize(busID + 1);
4244
exceptionHandler = this;
4345
this.trackPhases = true;
46+
this.phasesToTrack = BusBuilderImpl.ALL_PHASES;
4447
this.baseType = Event.class;
4548
this.checkTypesOnDispatch = checkTypesOnDispatchProperty;
4649
this.factory = new ClassLoaderFactory();
4750
}
4851

49-
private EventBus(final IEventExceptionHandler handler, boolean trackPhase, boolean startShutdown, Class<?> baseType, boolean checkTypesOnDispatch, IEventListenerFactory factory) {
52+
private EventBus(final IEventExceptionHandler handler, boolean trackPhase, EnumSet<EventPriority> phasesToTrack, boolean startShutdown, Class<?> baseType, boolean checkTypesOnDispatch, IEventListenerFactory factory) {
5053
ListenerList.resize(busID + 1);
5154
if (handler == null) exceptionHandler = this;
5255
else exceptionHandler = handler;
5356
this.trackPhases = trackPhase;
57+
this.phasesToTrack = trackPhase ? phasesToTrack : BusBuilderImpl.NO_PHASES;
5458
this.shutdown = startShutdown;
5559
this.baseType = baseType;
5660
this.checkTypesOnDispatch = checkTypesOnDispatch || checkTypesOnDispatchProperty;
5761
this.factory = factory;
5862
}
5963

6064
public EventBus(final BusBuilderImpl busBuilder) {
61-
this(busBuilder.exceptionHandler, busBuilder.trackPhases, busBuilder.startShutdown,
65+
this(busBuilder.exceptionHandler, busBuilder.trackPhases, busBuilder.phasesToTrack, busBuilder.startShutdown,
6266
busBuilder.markerType, busBuilder.checkTypesOnDispatch,
6367
busBuilder.modLauncher ? new ModLauncherFactory() : new ClassLoaderFactory());
6468
}
@@ -268,7 +272,7 @@ private void register(Class<?> eventType, Object target, Method method) {
268272

269273
private void addToListeners(final Object target, final Class<?> eventType, final IEventListener listener, final EventPriority priority) {
270274
ListenerList listenerList = EventListenerHelper.getListenerList(eventType);
271-
listenerList.register(busID, priority, listener);
275+
listenerList.register(busID, this, priority, listener);
272276
List<IEventListener> others = listeners.computeIfAbsent(target, k -> Collections.synchronizedList(new ArrayList<>()));
273277
others.add(listener);
274278
}

src/main/java/net/minecraftforge/eventbus/ListenerList.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import java.util.ArrayList;
1212
import java.util.Collections;
13+
import java.util.EnumSet;
1314
import java.util.List;
1415
import java.util.concurrent.Semaphore;
1516

@@ -85,6 +86,12 @@ public void register(int id, EventPriority priority, IEventListener listener) {
8586
lists[id].register(priority, listener);
8687
}
8788

89+
public void register(int id, EventBus eventBus, EventPriority priority, IEventListener listener) {
90+
var list = lists[id];
91+
list.phasesToTrack = eventBus.phasesToTrack;
92+
list.register(priority, listener);
93+
}
94+
8895
public void unregister(int id, IEventListener listener) {
8996
lists[id].unregister(listener);
9097
}
@@ -115,6 +122,7 @@ private static class ListenerListInst {
115122
private ListenerListInst parent;
116123
private List<ListenerListInst> children;
117124
private final Semaphore writeLock = new Semaphore(1, true);
125+
private EnumSet<EventPriority> phasesToTrack = BusBuilderImpl.ALL_PHASES;
118126

119127
private ListenerListInst() {}
120128

@@ -216,7 +224,8 @@ private IEventListener[] buildCache() {
216224
for (EventPriority value : EVENT_PRIORITY_VALUES) {
217225
List<IEventListener> listeners = getListeners(value);
218226
if (listeners.isEmpty()) continue;
219-
ret.add(value); // Add the priority to notify the event of its current phase.
227+
if (phasesToTrack.contains(value))
228+
ret.add(value); // Add the priority to notify the event of its current phase.
220229
ret.addAll(listeners);
221230
}
222231

src/main/java/net/minecraftforge/eventbus/api/BusBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import net.minecraftforge.eventbus.BusBuilderImpl;
88

9+
import java.util.EnumSet;
10+
911
/**
1012
* Build a bus
1113
*/
@@ -16,6 +18,15 @@ public static BusBuilder builder() {
1618

1719
/* true by default */
1820
BusBuilder setTrackPhases(boolean trackPhases);
21+
default BusBuilder setPhasesToTrack(EnumSet<EventPriority> phases) {
22+
throw new UnsupportedOperationException();
23+
}
24+
default BusBuilder setPhasesToTrack(EventPriority... phases) {
25+
return setPhasesToTrack(EnumSet.of(phases[0], phases));
26+
}
27+
default BusBuilder setPhasesToTrack(EventPriority phase) {
28+
return setPhasesToTrack(EnumSet.of(phase));
29+
}
1930
BusBuilder setExceptionHandler(IEventExceptionHandler handler);
2031
BusBuilder startShutdown();
2132
BusBuilder checkTypesOnDispatch();

0 commit comments

Comments
 (0)