Fix a resource leak that was causing Limelight-Embedded to hang instead of exiting after using mDNS discovery

This commit is contained in:
Cameron Gutman 2014-09-16 19:17:25 -07:00
parent 7124963c56
commit 5be499887d

View File

@ -26,6 +26,7 @@ public class MdnsDiscoveryAgent {
private Timer discoveryTimer; private Timer discoveryTimer;
private MdnsDiscoveryListener listener; private MdnsDiscoveryListener listener;
private HashSet<String> pendingResolution; private HashSet<String> pendingResolution;
private boolean stop;
private ServiceListener nvstreamListener = new ServiceListener() { private ServiceListener nvstreamListener = new ServiceListener() {
public void serviceAdded(ServiceEvent event) { public void serviceAdded(ServiceEvent event) {
LimeLog.info("mDNS: Machine appeared: "+event.getInfo().getName()); LimeLog.info("mDNS: Machine appeared: "+event.getInfo().getName());
@ -100,6 +101,7 @@ public class MdnsDiscoveryAgent {
} }
public void startDiscovery(final int discoveryIntervalMs) { public void startDiscovery(final int discoveryIntervalMs) {
stop = false;
discoveryTimer = new Timer(); discoveryTimer = new Timer();
discoveryTimer.schedule(new TimerTask() { discoveryTimer.schedule(new TimerTask() {
@Override @Override
@ -109,6 +111,15 @@ public class MdnsDiscoveryAgent {
try { try {
resolver.close(); resolver.close();
} catch (IOException e) {} } catch (IOException e) {}
resolver = null;
}
// Stop if requested
if (stop) {
// There will be no further timer invocations now
discoveryTimer.cancel();
discoveryTimer = null;
return;
} }
// Create a new resolver // Create a new resolver
@ -134,14 +145,8 @@ public class MdnsDiscoveryAgent {
} }
public void stopDiscovery() { public void stopDiscovery() {
if (discoveryTimer != null) { // Trigger a stop on the next timer expiration
discoveryTimer.cancel(); stop = true;
discoveryTimer = null;
}
if (resolver != null) {
resolver.removeServiceListener(SERVICE_TYPE, nvstreamListener);
}
} }
public List<MdnsComputer> getComputerSet() { public List<MdnsComputer> getComputerSet() {