static AutoCloseable dm_vmBus_answerToMessage(S msg, final F0 f) { final DynModule m = dm_current_mandatory(); Map map = vm_busListenersByMessage_live(); AutoCloseable c; synchronized(map) { Set listeners = map.get(msg); if (listeners == null) map.put(msg, listeners = syncIdentityHashSet()); // We're technically violating the one-synchronized-object-per-thread rule, // but it should be OK here. // TODO: remove empty sets from map c = tempAdd(listeners, func(S _msg, O arg) { temp m.enter(); ret callF(f, arg); }); } dm_ownResource(c); ret c; }