| Index: mojo/dart/packages/mojo/lib/src/stub.dart
|
| diff --git a/mojo/dart/packages/mojo/lib/src/stub.dart b/mojo/dart/packages/mojo/lib/src/stub.dart
|
| index 88715488838a35c0ded53af59b445248cff127e4..f86307e94cee264cdfbf972213af2f031d4c632c 100644
|
| --- a/mojo/dart/packages/mojo/lib/src/stub.dart
|
| +++ b/mojo/dart/packages/mojo/lib/src/stub.dart
|
| @@ -43,10 +43,6 @@ class Stub<T> implements MojoInterface<T> {
|
|
|
| abstract class StubMessageHandler extends core.MojoEventHandler
|
| implements MojoInterfaceControl {
|
| - int _outstandingResponseFutures = 0;
|
| - bool _isClosing = false;
|
| - Completer _closeCompleter;
|
| -
|
| StubMessageHandler.fromEndpoint(core.MojoMessagePipeEndpoint endpoint,
|
| {bool autoBegin: true})
|
| : super.fromEndpoint(endpoint, autoBegin: autoBegin);
|
| @@ -58,7 +54,7 @@ abstract class StubMessageHandler extends core.MojoEventHandler
|
|
|
| /// Generated StubControl classes implement this method to route messages to
|
| /// the correct implementation method.
|
| - dynamic handleMessage(ServiceMessage message);
|
| + void handleMessage(ServiceMessage message);
|
|
|
| /// Generated StubControl classes implement this getter to return the version
|
| /// of the mojom interface for which the bindings are generated.
|
| @@ -71,42 +67,16 @@ abstract class StubMessageHandler extends core.MojoEventHandler
|
| throw new MojoCodecError('Unexpected empty message or error: $result');
|
| }
|
|
|
| - // Prepare the response.
|
| - var message;
|
| - var response;
|
| try {
|
| - message = new ServiceMessage.fromMessage(new Message(result.data,
|
| + var message = new ServiceMessage.fromMessage(new Message(result.data,
|
| result.handles, result.dataLength, result.handlesLength));
|
| - response = _isClosing ? null : handleMessage(message);
|
| + handleMessage(message);
|
| } catch (e) {
|
| if (result.handles != null) {
|
| result.handles.forEach((h) => h.close());
|
| }
|
| rethrow;
|
| }
|
| -
|
| - // If there's a response, send it.
|
| - if (response != null) {
|
| - if (response is Future) {
|
| - _outstandingResponseFutures++;
|
| - response.then((response) {
|
| - _outstandingResponseFutures--;
|
| - return response;
|
| - }).then(_sendResponse);
|
| - } else {
|
| - _sendResponse(response);
|
| - }
|
| - } else if (_isClosing && (_outstandingResponseFutures == 0)) {
|
| - // We are closing, there is no response to send for this message, and
|
| - // there are no outstanding response futures. Do the close now.
|
| - super.close().then((_) {
|
| - if (_isClosing) {
|
| - _isClosing = false;
|
| - _closeCompleter.complete(null);
|
| - _closeCompleter = null;
|
| - }
|
| - });
|
| - }
|
| }
|
|
|
| @override
|
| @@ -114,30 +84,16 @@ abstract class StubMessageHandler extends core.MojoEventHandler
|
| throw 'Unexpected write signal in client.';
|
| }
|
|
|
| - // NB: |immediate| should only be true when calling close() while handling an
|
| - // exception thrown from handleRead(), e.g. when we receive a malformed
|
| - // message, or when we have received the PEER_CLOSED event.
|
| - @override
|
| - Future close({bool immediate: false}) {
|
| - if (isOpen &&
|
| - !immediate &&
|
| - !isPeerClosed &&
|
| - (isInHandler || (_outstandingResponseFutures > 0))) {
|
| - // Either close() is being called from within handleRead() or
|
| - // handleWrite(), or close() is being called while there are outstanding
|
| - // response futures. Defer the actual close until all response futures
|
| - // have been resolved.
|
| - _isClosing = true;
|
| - _closeCompleter = new Completer();
|
| - return _closeCompleter.future;
|
| - } else {
|
| - return super.close(immediate: immediate).then((_) {
|
| - if (_isClosing) {
|
| - _isClosing = false;
|
| - _closeCompleter.complete(null);
|
| - _closeCompleter = null;
|
| - }
|
| - });
|
| + /// Called by generated handleMessage functions in implementations.
|
| + void sendResponse(Message response) {
|
| + if (isOpen) {
|
| + endpoint.write(
|
| + response.buffer, response.buffer.lengthInBytes, response.handles);
|
| + // FailedPrecondition is only used to indicate that the other end of
|
| + // the pipe has been closed. We can ignore the close here and wait for
|
| + // the PeerClosed signal on the event stream.
|
| + assert((endpoint.status == core.MojoResult.kOk) ||
|
| + (endpoint.status == core.MojoResult.kFailedPrecondition));
|
| }
|
| }
|
|
|
| @@ -161,27 +117,4 @@ abstract class StubMessageHandler extends core.MojoEventHandler
|
| /// of the service being stubbed.
|
| /// Note: The description is null or incomplete if type info is unavailable.
|
| service_describer.ServiceDescription get description => null;
|
| -
|
| - void _sendResponse(Message response) {
|
| - if (isOpen) {
|
| - endpoint.write(
|
| - response.buffer, response.buffer.lengthInBytes, response.handles);
|
| - // FailedPrecondition is only used to indicate that the other end of
|
| - // the pipe has been closed. We can ignore the close here and wait for
|
| - // the PeerClosed signal on the event stream.
|
| - assert((endpoint.status == core.MojoResult.kOk) ||
|
| - (endpoint.status == core.MojoResult.kFailedPrecondition));
|
| - if (_isClosing && (_outstandingResponseFutures == 0)) {
|
| - // This was the final response future for which we needed to send
|
| - // a response. It is safe to close.
|
| - super.close().then((_) {
|
| - if (_isClosing) {
|
| - _isClosing = false;
|
| - _closeCompleter.complete(null);
|
| - _closeCompleter = null;
|
| - }
|
| - });
|
| - }
|
| - }
|
| - }
|
| }
|
|
|