Skip to content

Commit 7c2a13d

Browse files
authored
Merge pull request #17705 from iterate-ch/bugfix/SDS-1684-reachability-thread
Run network change notification on background thread.
2 parents ddce203 + 86aee3a commit 7c2a13d

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

core/dylib/src/main/java/ch/cyberduck/core/diagnostics/SystemConfigurationReachability.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import ch.cyberduck.core.HostnameConfiguratorFactory;
3030
import ch.cyberduck.core.exception.BackgroundException;
3131
import ch.cyberduck.core.idna.PunycodeConverter;
32+
import ch.cyberduck.core.threading.DefaultThreadPool;
33+
import ch.cyberduck.core.threading.ThreadPool;
3234

3335
import org.apache.logging.log4j.LogManager;
3436
import 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

Comments
 (0)