| Index: lib/src/directory_watcher/mac_os.dart | 
| diff --git a/lib/src/directory_watcher/mac_os.dart b/lib/src/directory_watcher/mac_os.dart | 
| index e3efa2dd64bc034aaeed4b1e9369c67171a036c1..e6f08dcb7751cb799d52c1925320155e1b0e563a 100644 | 
| --- a/lib/src/directory_watcher/mac_os.dart | 
| +++ b/lib/src/directory_watcher/mac_os.dart | 
| @@ -69,9 +69,9 @@ class _MacOSDirectoryWatcher implements ManuallyClosedDirectoryWatcher { | 
| /// the directory to determine its initial state. | 
| StreamSubscription<FileSystemEntity> _initialListSubscription; | 
|  | 
| -  /// The subscription to the [Directory.list] call for listing the contents of | 
| -  /// a subdirectory that was moved into the watched directory. | 
| -  StreamSubscription<FileSystemEntity> _listSubscription; | 
| +  /// The subscriptions to [Directory.list] calls for listing the contents of a | 
| +  /// subdirectory that was moved into the watched directory. | 
| +  final _listSubscriptions = new Set<StreamSubscription<FileSystemEntity>>(); | 
|  | 
| /// The timer for tracking how long we wait for an initial batch of bogus | 
| /// events (see issue 14373). | 
| @@ -113,10 +113,14 @@ class _MacOSDirectoryWatcher implements ManuallyClosedDirectoryWatcher { | 
| } | 
| if (_watchSubscription != null) _watchSubscription.cancel(); | 
| if (_initialListSubscription != null) _initialListSubscription.cancel(); | 
| -    if (_listSubscription != null) _listSubscription.cancel(); | 
| _watchSubscription = null; | 
| _initialListSubscription = null; | 
| -    _listSubscription = null; | 
| + | 
| +    for (var subscription in _listSubscriptions) { | 
| +      subscription.cancel(); | 
| +    } | 
| +    _listSubscriptions.clear(); | 
| + | 
| _eventsController.close(); | 
| } | 
|  | 
| @@ -191,8 +195,9 @@ class _MacOSDirectoryWatcher implements ManuallyClosedDirectoryWatcher { | 
|  | 
| if (_files.containsDir(path)) continue; | 
|  | 
| -          var stream = Chain.track(new Directory(path).list(recursive: true)); | 
| -          _listSubscription = stream.listen((entity) { | 
| +          var subscription; | 
| +          subscription = Chain.track(new Directory(path).list(recursive: true)) | 
| +              .listen((entity) { | 
| if (entity is Directory) return; | 
| if (_files.contains(path)) return; | 
|  | 
| @@ -203,7 +208,10 @@ class _MacOSDirectoryWatcher implements ManuallyClosedDirectoryWatcher { | 
| print("[$_id] got error listing $relativePath: $e"); | 
| } | 
| _emitError(e, stackTrace); | 
| +          }, onDone: () { | 
| +            _listSubscriptions.remove(subscription); | 
| }, cancelOnError: true); | 
| +          _listSubscriptions.add(subscription); | 
| } else if (event is FileSystemModifyEvent) { | 
| assert(!event.isDirectory); | 
| _emitEvent(ChangeType.MODIFY, path); | 
|  |