Skip to content

Commit b16bcf7

Browse files
authored
Fix recursive update exception from BusGroupImpl#getOrCreateEventBus
1 parent 51f6169 commit b16bcf7

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/main/java/net/minecraftforge/eventbus/internal/BusGroupImpl.java

+13-5
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ public Collection<EventListener> register(MethodHandles.Lookup callerLookup, Obj
7373
}
7474

7575
@Override
76-
@SuppressWarnings({"unchecked", "rawtypes"})
7776
public void unregister(Collection<EventListener> listeners) {
7877
if (listeners.isEmpty())
7978
throw new IllegalArgumentException("Listeners cannot be empty! You should be getting the collection from" +
@@ -96,11 +95,11 @@ private <T extends Event> EventBus<T> createEventBus(Class<T> eventType) {
9695
if (RecordEvent.class.isAssignableFrom(eventType) && !eventType.isRecord())
9796
throw new IllegalArgumentException("Event type " + eventType + " is not a record class but implements RecordEvent");
9897

99-
if (MonitorAware.class.isAssignableFrom(eventType) && !MutableEvent.class.isAssignableFrom(eventType))
100-
throw new IllegalArgumentException("Event type " + eventType + " implements MonitorAware but is not a MutableEvent");
101-
10298
int characteristics = AbstractEventBusImpl.computeEventCharacteristics(eventType);
10399

100+
if (Constants.isMonitorAware(characteristics) && !MutableEvent.class.isAssignableFrom(eventType))
101+
throw new IllegalArgumentException("Event type " + eventType + " implements MonitorAware but is not a MutableEvent");
102+
104103
var backingList = new ArrayList<EventListener>();
105104
List<EventBus<?>> parents = Collections.emptyList();
106105
if (Constants.isInheritable(characteristics)) {
@@ -126,7 +125,16 @@ private <T extends Event> EventBus<T> createEventBus(Class<T> eventType) {
126125

127126
@SuppressWarnings("unchecked")
128127
public <T extends Event> EventBus<T> getOrCreateEventBus(Class<T> eventType) {
129-
return (EventBus<T>) eventBuses.computeIfAbsent(eventType, event -> createEventBus(eventType));
128+
var eventBus = eventBuses.get(eventType);
129+
if (eventBus != null)
130+
return (EventBus<T>) eventBus;
131+
132+
var computedEventBus = createEventBus(eventType);
133+
134+
synchronized (eventBuses) {
135+
eventBuses.putIfAbsent(eventType, computedEventBus);
136+
return computedEventBus;
137+
}
130138
}
131139
//endregion
132140

0 commit comments

Comments
 (0)