| Index: sdk/lib/io/file_impl.dart | 
| diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart | 
| index c9bfb8cc33384944d3c59e0dc04a4534fc66c745..1dce796efc46c74f6049a15b331138c286971bf2 100644 | 
| --- a/sdk/lib/io/file_impl.dart | 
| +++ b/sdk/lib/io/file_impl.dart | 
| @@ -17,6 +17,7 @@ class _FileStream extends Stream<List<int>> { | 
| RandomAccessFile _openedFile; | 
| int _position; | 
| int _end; | 
| +  final Completer _closeCompleter = new Completer(); | 
|  | 
| // Has the stream been paused or unsubscribed? | 
| bool _paused = false; | 
| @@ -58,14 +59,16 @@ class _FileStream extends Stream<List<int>> { | 
| } | 
|  | 
| Future _closeFile() { | 
| -    Future closeFuture; | 
| +    if (_readInProgress) { | 
| +      return _closeCompleter.future; | 
| +    } | 
| if (_openedFile != null) { | 
| -      Future closeFuture = _openedFile.close(); | 
| +      _openedFile.close() | 
| +          .then(_closeCompleter.complete, | 
| +                onError: _closeCompleter.completeError); | 
| _openedFile = null; | 
| -      return closeFuture; | 
| -    } else { | 
| -      return new Future.value(); | 
| } | 
| +    return _closeCompleter.future; | 
| } | 
|  | 
| void _readBlock() { | 
| @@ -76,6 +79,7 @@ class _FileStream extends Stream<List<int>> { | 
| if (_end != null) { | 
| readBytes = min(readBytes, _end - _position); | 
| if (readBytes < 0) { | 
| +        _readInProgress = false; | 
| if (!_unsubscribed) { | 
| _controller.addError(new RangeError("Bad end position: $_end")); | 
| _closeFile().then((_) { _controller.close(); }); | 
| @@ -85,8 +89,14 @@ class _FileStream extends Stream<List<int>> { | 
| } | 
| } | 
| _openedFile.read(readBytes) | 
| -      .then((block) { | 
| +      .whenComplete(() { | 
| _readInProgress = false; | 
| +      }) | 
| +      .then((block) { | 
| +        if (_unsubscribed) { | 
| +          _closeFile(); | 
| +          return; | 
| +        } | 
| if (block.length == 0) { | 
| if (!_unsubscribed) { | 
| _closeFile().then((_) { _controller.close(); }); | 
|  |