Wrote code to help automatically detect bugs.
Have invocation marshallers track whether someone ever ended up responding to the client: if they get garbage collected without ever doing so (and they're not the base class InvocationMarshaller, which can only report errors), log an informative error message. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3792 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -70,9 +70,19 @@ public class InvocationMarshaller
|
|||||||
* responses. This is only valid on the server. */
|
* responses. This is only valid on the server. */
|
||||||
public transient DObjectManager omgr;
|
public transient DObjectManager omgr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an identifier for the invocation that this listener
|
||||||
|
* is used for, so we can report it if we are never responded-to.
|
||||||
|
*/
|
||||||
|
public void setInvocationId (String name)
|
||||||
|
{
|
||||||
|
_invId = name;
|
||||||
|
}
|
||||||
|
|
||||||
// documentation inherited from interface
|
// documentation inherited from interface
|
||||||
public void requestFailed (String cause)
|
public void requestFailed (String cause)
|
||||||
{
|
{
|
||||||
|
_invId = null;
|
||||||
omgr.postEvent(new InvocationResponseEvent(
|
omgr.postEvent(new InvocationResponseEvent(
|
||||||
callerOid, requestId, REQUEST_FAILED_RSPID,
|
callerOid, requestId, REQUEST_FAILED_RSPID,
|
||||||
new Object[] { cause }));
|
new Object[] { cause }));
|
||||||
@@ -103,6 +113,20 @@ public class InvocationMarshaller
|
|||||||
return "[callerOid=" + callerOid + ", reqId=" + requestId +
|
return "[callerOid=" + callerOid + ", reqId=" + requestId +
|
||||||
", type=" + getClass().getName() + "]";
|
", type=" + getClass().getName() + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
protected void finalize ()
|
||||||
|
throws Throwable
|
||||||
|
{
|
||||||
|
if (_invId != null && getClass() != ListenerMarshaller.class) {
|
||||||
|
Log.warning("Invocation listener never responded to: " +
|
||||||
|
_invId);
|
||||||
|
}
|
||||||
|
super.finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** On the server, the id of the invocation method. */
|
||||||
|
protected transient String _invId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,6 +142,7 @@ public class InvocationMarshaller
|
|||||||
// documentation inherited from interface
|
// documentation inherited from interface
|
||||||
public void requestProcessed ()
|
public void requestProcessed ()
|
||||||
{
|
{
|
||||||
|
_invId = null;
|
||||||
omgr.postEvent(new InvocationResponseEvent(
|
omgr.postEvent(new InvocationResponseEvent(
|
||||||
callerOid, requestId, REQUEST_PROCESSED,
|
callerOid, requestId, REQUEST_PROCESSED,
|
||||||
null));
|
null));
|
||||||
@@ -150,6 +175,7 @@ public class InvocationMarshaller
|
|||||||
// documentation inherited from interface
|
// documentation inherited from interface
|
||||||
public void requestProcessed (Object result)
|
public void requestProcessed (Object result)
|
||||||
{
|
{
|
||||||
|
_invId = null;
|
||||||
omgr.postEvent(new InvocationResponseEvent(
|
omgr.postEvent(new InvocationResponseEvent(
|
||||||
callerOid, requestId, REQUEST_PROCESSED,
|
callerOid, requestId, REQUEST_PROCESSED,
|
||||||
new Object[] { result }));
|
new Object[] { result }));
|
||||||
|
|||||||
@@ -256,6 +256,10 @@ public class InvocationManager
|
|||||||
|
|
||||||
// dispatch the request
|
// dispatch the request
|
||||||
try {
|
try {
|
||||||
|
if (rlist != null) {
|
||||||
|
rlist.setInvocationId(StringUtil.shortClassName(disp) +
|
||||||
|
", methodId=" + methodId);
|
||||||
|
}
|
||||||
disp.dispatchRequest(source, methodId, args);
|
disp.dispatchRequest(source, methodId, args);
|
||||||
|
|
||||||
} catch (InvocationException ie) {
|
} catch (InvocationException ie) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public class ${name}Marshaller extends InvocationMarshaller
|
|||||||
// documentation inherited from interface
|
// documentation inherited from interface
|
||||||
public void $lm.method.name ($lm.getArgList(false))
|
public void $lm.method.name ($lm.getArgList(false))
|
||||||
{
|
{
|
||||||
|
_invId = null;
|
||||||
omgr.postEvent(new InvocationResponseEvent(
|
omgr.postEvent(new InvocationResponseEvent(
|
||||||
callerOid, requestId, $lm.code,
|
callerOid, requestId, $lm.code,
|
||||||
new Object[] { $lm.getWrappedArgList(false) }));
|
new Object[] { $lm.getWrappedArgList(false) }));
|
||||||
|
|||||||
Reference in New Issue
Block a user