static O vmBus_onMessage_withLivelinessCheck(bool verbose default false, IF0 livelinessCheck, S msg, IVF1 onMessage) { // Do this BEFORE synchronizing on the map! VMBusListenerWithLivelinessCheck listener = new(null, livelinessCheck, (_msg, arg) -> onMessage.get((A) arg)); listener.verbose = verbose; Map map = vm_busListenersByMessage_live(); synchronized(map) { Set listeners = map.get(msg); if (listeners == null) map.put(msg, listeners = syncIdentityHashSet()); listener.listeners = listeners; // We're technically violating the one-synchronized-object-per-thread rule, // but it should be OK here. listeners.add(listener); ret listener; } }