Remove WeakListenerWrapper in favor of simply storing the WeakReference
directly in the array. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6078 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -252,17 +252,17 @@ public class DObject
|
|||||||
int idx = getListenerIndex(listener);
|
int idx = getListenerIndex(listener);
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
_listeners = ListUtil.add(_listeners,
|
_listeners = ListUtil.add(_listeners,
|
||||||
weak ? new WeakListenerWrapper(listener) : listener);
|
weak ? new WeakReference<Object>(listener) : listener);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean oweak = _listeners[idx] instanceof WeakListenerWrapper;
|
boolean oweak = _listeners[idx] instanceof WeakReference;
|
||||||
if (weak == oweak) {
|
if (weak == oweak) {
|
||||||
log.warning("Refusing repeat listener registration",
|
log.warning("Refusing repeat listener registration",
|
||||||
"dobj", which(), "list", listener, new Exception());
|
"dobj", which(), "list", listener, new Exception());
|
||||||
} else {
|
} else {
|
||||||
log.warning("Updating listener registered under different strength.",
|
log.warning("Updating listener registered under different strength.",
|
||||||
"dobj", which(), "list", listener, "oweak", oweak, "nweak", weak, new Exception());
|
"dobj", which(), "list", listener, "oweak", oweak, "nweak", weak, new Exception());
|
||||||
_listeners[idx] = weak ? new WeakListenerWrapper(listener) : listener;
|
_listeners[idx] = weak ? new WeakReference<Object>(listener) : listener;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,6 +469,12 @@ public class DObject
|
|||||||
if (listener == null) {
|
if (listener == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (listener instanceof WeakReference) {
|
||||||
|
if ((listener = ((WeakReference<?>)listener).get()) == null) {
|
||||||
|
_listeners[i] = null;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// do any event specific notifications
|
// do any event specific notifications
|
||||||
@@ -1023,46 +1029,14 @@ public class DObject
|
|||||||
}
|
}
|
||||||
for (int ii = 0, ll = _listeners.length; ii < ll; ii++) {
|
for (int ii = 0, ll = _listeners.length; ii < ll; ii++) {
|
||||||
Object olistener = _listeners[ii];
|
Object olistener = _listeners[ii];
|
||||||
if (olistener == listener || (olistener instanceof WeakListenerWrapper &&
|
if (olistener == listener || (olistener instanceof WeakReference &&
|
||||||
((WeakListenerWrapper)olistener).ref.get() == listener)) {
|
((WeakReference<?>)olistener).get() == listener)) {
|
||||||
return ii;
|
return ii;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* A listener that wraps a weak reference to another listener.
|
|
||||||
*/
|
|
||||||
protected class WeakListenerWrapper
|
|
||||||
implements EventListener
|
|
||||||
{
|
|
||||||
/** The weak reference to our underlying listener. */
|
|
||||||
public final WeakReference<ChangeListener> ref;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new weak listener wrapper.
|
|
||||||
*/
|
|
||||||
public WeakListenerWrapper (ChangeListener listener)
|
|
||||||
{
|
|
||||||
ref = new WeakReference<ChangeListener>(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
// documentation inherited from interface EventListener
|
|
||||||
public void eventReceived (DEvent event)
|
|
||||||
{
|
|
||||||
ChangeListener listener = ref.get();
|
|
||||||
if (listener == null) {
|
|
||||||
ListUtil.clearRef(_listeners, this);
|
|
||||||
} else {
|
|
||||||
event.notifyListener(listener);
|
|
||||||
if (listener instanceof EventListener) {
|
|
||||||
((EventListener)listener).eventReceived(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Our object id. */
|
/** Our object id. */
|
||||||
protected int _oid;
|
protected int _oid;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user