| Index: third_party/mojo/src/mojo/public/dart/src/stub.dart
|
| diff --git a/third_party/mojo/src/mojo/public/dart/src/stub.dart b/third_party/mojo/src/mojo/public/dart/src/stub.dart
|
| index 6695f07a3353a0cc088cc65de311b5f1a6db452e..9008f55e2abef06c557c58a739ac85b8a8d5c697 100644
|
| --- a/third_party/mojo/src/mojo/public/dart/src/stub.dart
|
| +++ b/third_party/mojo/src/mojo/public/dart/src/stub.dart
|
| @@ -44,26 +44,29 @@ abstract class Stub extends core.MojoEventStreamListener {
|
| if (isOpen) {
|
| endpoint.write(
|
| response.buffer, response.buffer.lengthInBytes, response.handles);
|
| - if (!endpoint.status.isOk) {
|
| - throw 'message pipe write failed: ${endpoint.status}';
|
| - }
|
| + // 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.isOk || endpoint.status.isFailedPrecondition);
|
| 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();
|
| - _isClosing = false;
|
| - _closeCompleter.complete(null);
|
| - _closeCompleter = null;
|
| + super.close().then((_) {
|
| + _isClosing = false;
|
| + _closeCompleter.complete(null);
|
| + _closeCompleter = null;
|
| + });
|
| }
|
| }
|
| });
|
| } 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();
|
| - _isClosing = false;
|
| - _closeCompleter.complete(null);
|
| - _closeCompleter = null;
|
| + super.close().then((_) {
|
| + _isClosing = false;
|
| + _closeCompleter.complete(null);
|
| + _closeCompleter = null;
|
| + });
|
| }
|
| }
|
|
|
| @@ -73,7 +76,8 @@ abstract class Stub extends core.MojoEventStreamListener {
|
|
|
| // NB: |nodefer| should only be true when calling close() while handling an
|
| // exception thrown from handleRead(), e.g. when we receive a malformed
|
| - // message.
|
| + // message, or when we have received the PEER_CLOSED event.
|
| + @override
|
| Future close({bool nodefer: false}) {
|
| if (isOpen &&
|
| !nodefer &&
|
| @@ -86,7 +90,13 @@ abstract class Stub extends core.MojoEventStreamListener {
|
| _closeCompleter = new Completer();
|
| return _closeCompleter.future;
|
| } else {
|
| - return super.close();
|
| + return super.close(nodefer: nodefer).then((_) {
|
| + if (_isClosing) {
|
| + _isClosing = false;
|
| + _closeCompleter.complete(null);
|
| + _closeCompleter = null;
|
| + }
|
| + });
|
| }
|
| }
|
|
|
|
|