Reflection is much faster these days, but we do a lot of event processing, so

let's not surreptitiously slow things down.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5768 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2009-05-04 17:50:44 +00:00
parent 533c7f5408
commit 6c962bf3d4
@@ -22,7 +22,6 @@
package com.threerings.presents.server; package com.threerings.presents.server;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.List; import java.util.List;
@@ -737,12 +736,10 @@ public class PresentsDObjectMgr
boolean notify = true; // assume always notify boolean notify = true; // assume always notify
try { try {
// do any internal management necessary based on this event // do any internal management necessary based on this event
Method helper = _helpers.get(event.getClass()); EventHelper helper = _helpers.get(event.getClass());
if (helper != null) { if (helper != null) {
// invoke the helper method
Object rv = helper.invoke(this, new Object[] { event, target });
// if helper returns false, we abort event processing // if helper returns false, we abort event processing
if (!((Boolean)rv).booleanValue()) { if (!helper.invoke(event, target)) {
return false; return false;
} }
} }
@@ -830,18 +827,22 @@ public class PresentsDObjectMgr
*/ */
protected void registerEventHelpers () protected void registerEventHelpers ()
{ {
Class<?>[] ptypes = new Class<?>[] { DEvent.class, DObject.class };
Method method;
try { try {
method = PresentsDObjectMgr.class.getMethod("objectDestroyed", ptypes); _helpers.put(ObjectDestroyedEvent.class, new EventHelper () {
_helpers.put(ObjectDestroyedEvent.class, method); public boolean invoke (DEvent event, DObject target) {
return objectDestroyed(event, target);
method = PresentsDObjectMgr.class.getMethod("objectAdded", ptypes); }
_helpers.put(ObjectAddedEvent.class, method); });
_helpers.put(ObjectAddedEvent.class, new EventHelper() {
method = PresentsDObjectMgr.class.getMethod("objectRemoved", ptypes); public boolean invoke (DEvent event, DObject target) {
_helpers.put(ObjectRemovedEvent.class, method); return objectAdded(event, target);
}
});
_helpers.put(ObjectRemovedEvent.class, new EventHelper() {
public boolean invoke (DEvent event, DObject target) {
return objectRemoved(event, target);
}
});
} catch (Exception e) { } catch (Exception e) {
log.warning("Unable to register event helpers", "error", e); log.warning("Unable to register event helpers", "error", e);
@@ -1008,6 +1009,12 @@ public class PresentsDObjectMgr
} }
} }
/** Does some helpy bits for certain events. */
protected static interface EventHelper
{
public boolean invoke (DEvent event, DObject target);
}
/** A flag indicating that the event dispatcher is still running. */ /** A flag indicating that the event dispatcher is still running. */
protected boolean _running = true; protected boolean _running = true;
@@ -1050,7 +1057,7 @@ public class PresentsDObjectMgr
protected Stats _recent = new Stats(), _current = _recent; protected Stats _recent = new Stats(), _current = _recent;
/** Maps event classes to helpers that perform additional processing for particular events. */ /** Maps event classes to helpers that perform additional processing for particular events. */
protected Map<Class<?>, Method> _helpers = Maps.newHashMap(); protected Map<Class<?>, EventHelper> _helpers = Maps.newHashMap();
/** Used to resolve unit names when profiling. Injected by the invmgr when it's created. */ /** Used to resolve unit names when profiling. Injected by the invmgr when it's created. */
protected InvocationManager _invmgr; protected InvocationManager _invmgr;