mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2026-06-16 22:01:14 +00:00
Fix race condition when stopDiscovery() is called during onServiceFound()/onServiceLost()
This commit is contained in:
@@ -20,13 +20,13 @@ import java.util.concurrent.TimeUnit;
|
|||||||
@TargetApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
|
@TargetApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
|
||||||
public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
||||||
private static final String SERVICE_TYPE = "_nvstream._tcp";
|
private static final String SERVICE_TYPE = "_nvstream._tcp";
|
||||||
private NsdManager nsdManager;
|
private final NsdManager nsdManager;
|
||||||
private boolean discoveryActive;
|
private boolean discoveryActive;
|
||||||
private boolean wantsDiscoveryActive;
|
private boolean wantsDiscoveryActive;
|
||||||
private final HashMap<String, NsdManager.ServiceInfoCallback> serviceCallbacks = new HashMap<>();
|
private final HashMap<String, NsdManager.ServiceInfoCallback> serviceCallbacks = new HashMap<>();
|
||||||
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
|
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
|
||||||
|
|
||||||
private NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() {
|
private final NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
|
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
|
||||||
discoveryActive = false;
|
discoveryActive = false;
|
||||||
@@ -63,6 +63,13 @@ public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServiceFound(NsdServiceInfo nsdServiceInfo) {
|
public void onServiceFound(NsdServiceInfo nsdServiceInfo) {
|
||||||
|
// Protect against racing stopDiscovery() call
|
||||||
|
synchronized (serviceCallbacks) {
|
||||||
|
// Bail if we've been stopped
|
||||||
|
if (!wantsDiscoveryActive) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LimeLog.info("NSD: Machine appeared: "+nsdServiceInfo.getServiceName());
|
LimeLog.info("NSD: Machine appeared: "+nsdServiceInfo.getServiceName());
|
||||||
|
|
||||||
NsdManager.ServiceInfoCallback serviceInfoCallback = new NsdManager.ServiceInfoCallback() {
|
NsdManager.ServiceInfoCallback serviceInfoCallback = new NsdManager.ServiceInfoCallback() {
|
||||||
@@ -90,9 +97,17 @@ public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
|||||||
nsdManager.registerServiceInfoCallback(nsdServiceInfo, executor, serviceInfoCallback);
|
nsdManager.registerServiceInfoCallback(nsdServiceInfo, executor, serviceInfoCallback);
|
||||||
serviceCallbacks.put(nsdServiceInfo.getServiceName(), serviceInfoCallback);
|
serviceCallbacks.put(nsdServiceInfo.getServiceName(), serviceInfoCallback);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServiceLost(NsdServiceInfo nsdServiceInfo) {
|
public void onServiceLost(NsdServiceInfo nsdServiceInfo) {
|
||||||
|
// Protect against racing stopDiscovery() call
|
||||||
|
synchronized (serviceCallbacks) {
|
||||||
|
// Bail if we've been stopped
|
||||||
|
if (!wantsDiscoveryActive) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LimeLog.info("NSD: Machine lost: " + nsdServiceInfo.getServiceName());
|
LimeLog.info("NSD: Machine lost: " + nsdServiceInfo.getServiceName());
|
||||||
|
|
||||||
NsdManager.ServiceInfoCallback serviceInfoCallback = serviceCallbacks.remove(nsdServiceInfo.getServiceName());
|
NsdManager.ServiceInfoCallback serviceInfoCallback = serviceCallbacks.remove(nsdServiceInfo.getServiceName());
|
||||||
@@ -100,6 +115,7 @@ public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
|||||||
nsdManager.unregisterServiceInfoCallback(serviceInfoCallback);
|
nsdManager.unregisterServiceInfoCallback(serviceInfoCallback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public NsdManagerDiscoveryAgent(Context context, MdnsDiscoveryListener listener) {
|
public NsdManagerDiscoveryAgent(Context context, MdnsDiscoveryListener listener) {
|
||||||
@@ -119,6 +135,8 @@ public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stopDiscovery() {
|
public void stopDiscovery() {
|
||||||
|
// Protect against racing ServiceInfoCallback and DiscoveryListener callbacks
|
||||||
|
synchronized (serviceCallbacks) {
|
||||||
wantsDiscoveryActive = false;
|
wantsDiscoveryActive = false;
|
||||||
|
|
||||||
// Unregister the service discovery listener
|
// Unregister the service discovery listener
|
||||||
@@ -132,6 +150,7 @@ public class NsdManagerDiscoveryAgent extends MdnsDiscoveryAgent {
|
|||||||
}
|
}
|
||||||
serviceCallbacks.clear();
|
serviceCallbacks.clear();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static Inet4Address[] getV4Addrs(List<InetAddress> addrs) {
|
private static Inet4Address[] getV4Addrs(List<InetAddress> addrs) {
|
||||||
int matchCount = 0;
|
int matchCount = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user