Fixed bug with long running clients. The results for invocation requests with ids exceeding Short.MAX_VALUE could not be processed due to the id being deserialized as a short but stored in the map with an integer key.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5483 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -27,6 +27,7 @@ import flash.utils.getTimer; // function import
|
|||||||
import com.threerings.util.Boxed;
|
import com.threerings.util.Boxed;
|
||||||
import com.threerings.util.HashMap;
|
import com.threerings.util.HashMap;
|
||||||
import com.threerings.util.Log;
|
import com.threerings.util.Log;
|
||||||
|
import com.threerings.util.Short;
|
||||||
|
|
||||||
import com.threerings.presents.data.InvocationMarshaller_ListenerMarshaller;
|
import com.threerings.presents.data.InvocationMarshaller_ListenerMarshaller;
|
||||||
|
|
||||||
@@ -340,11 +341,22 @@ public class InvocationDirector
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to generate monotonically increasing invocation request ids.
|
* Used to generate (almost) monotonically increasing invocation request ids. The ids wrap
|
||||||
|
* around to Short.MIN_VALUE after Short.MAX_VALUE is reached.
|
||||||
*/
|
*/
|
||||||
protected function nextRequestId () :int
|
protected function nextRequestId () :int
|
||||||
{
|
{
|
||||||
return _requestId++;
|
// post increment with wraparound - this is necessary because the request id is
|
||||||
|
// serialized as a java short in all instances. since action script does not appear
|
||||||
|
// to support sign extension, wraparound in the integer domain explicitly. This will
|
||||||
|
// make the values in our _listeners map reliable. Cleverer ways to wrapround may exist.
|
||||||
|
var current :int = _requestId;
|
||||||
|
if (_requestId == Short.MAX_VALUE) { // x7fff
|
||||||
|
_requestId = -Short.MIN_VALUE; // x8000
|
||||||
|
} else {
|
||||||
|
_requestId++;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user