2929import ch .cyberduck .core .HostnameConfiguratorFactory ;
3030import ch .cyberduck .core .exception .BackgroundException ;
3131import ch .cyberduck .core .idna .PunycodeConverter ;
32+ import ch .cyberduck .core .threading .DefaultThreadPool ;
33+ import ch .cyberduck .core .threading .ThreadPool ;
3234
3335import org .apache .logging .log4j .LogManager ;
3436import org .apache .logging .log4j .Logger ;
@@ -43,17 +45,25 @@ public class SystemConfigurationReachability implements Reachability {
4345
4446 private final NSNotificationCenter notificationCenter = NSNotificationCenter .defaultCenter ();
4547
46- private static final class NotificationFilterCallback extends Proxy {
48+ private static final class ThreadedNotificationSelector extends Proxy {
4749 private final Callback proxy ;
50+ private final ThreadPool executor = new DefaultThreadPool ("reachability" , 1 );
4851
49- public NotificationFilterCallback (final Callback proxy ) {
52+ public ThreadedNotificationSelector (final Callback proxy ) {
5053 this .proxy = proxy ;
5154 }
5255
5356 @ Delegate
5457 public void notify (final NSNotification notification ) {
5558 log .debug ("Received notification {}" , notification );
56- proxy .change ();
59+ executor .execute (() -> {
60+ proxy .change ();
61+ return null ;
62+ });
63+ }
64+
65+ public void shutdown () {
66+ executor .shutdown (true );
5767 }
5868 }
5969
@@ -62,7 +72,7 @@ public Monitor monitor(final Host bookmark, final Callback callback) {
6272 final String url = toURL (bookmark );
6373 return new Reachability .Monitor () {
6474 private final SystemConfigurationReachability .Native monitor = SystemConfigurationReachability .Native .monitorForUrl (url );
65- private final NotificationFilterCallback listener = new NotificationFilterCallback (callback );
75+ private final ThreadedNotificationSelector listener = new ThreadedNotificationSelector (callback );
6676
6777 @ Override
6878 public Monitor start () {
@@ -78,6 +88,7 @@ public Monitor stop() {
7888 if (monitor .stopReachabilityMonitor ()) {
7989 notificationCenter .removeObserver (listener .id ());
8090 }
91+ listener .shutdown ();
8192 return this ;
8293 }
8394 };
0 commit comments