Merge "Ensure the ServiceTypeClient Executor threads can be shutdown" into main
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.server.connectivity.mdns;
|
package com.android.server.connectivity.mdns;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -47,5 +48,17 @@ public class ExecutorProvider {
|
|||||||
}
|
}
|
||||||
executor.shutdownNow();
|
executor.shutdownNow();
|
||||||
}
|
}
|
||||||
|
serviceTypeClientSchedulerExecutors.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shutdown one executor service and remove the executor service from the set.
|
||||||
|
* @param executorService the executorService to be shutdown
|
||||||
|
*/
|
||||||
|
public void shutdownExecutorService(@NonNull ScheduledExecutorService executorService) {
|
||||||
|
if (!executorService.isShutdown()) {
|
||||||
|
executorService.shutdownNow();
|
||||||
|
}
|
||||||
|
serviceTypeClientSchedulerExecutors.remove(executorService);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -204,6 +204,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
if (serviceTypeClient == null) return;
|
if (serviceTypeClient == null) return;
|
||||||
// Notify all listeners that all services are removed from this socket.
|
// Notify all listeners that all services are removed from this socket.
|
||||||
serviceTypeClient.notifySocketDestroyed();
|
serviceTypeClient.notifySocketDestroyed();
|
||||||
|
executorProvider.shutdownExecutorService(serviceTypeClient.getExecutor());
|
||||||
perSocketServiceTypeClients.remove(serviceTypeClient);
|
perSocketServiceTypeClients.remove(serviceTypeClient);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -238,6 +239,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
if (serviceTypeClient.stopSendAndReceive(listener)) {
|
if (serviceTypeClient.stopSendAndReceive(listener)) {
|
||||||
// No listener is registered for the service type anymore, remove it from the list
|
// No listener is registered for the service type anymore, remove it from the list
|
||||||
// of the service type clients.
|
// of the service type clients.
|
||||||
|
executorProvider.shutdownExecutorService(serviceTypeClient.getExecutor());
|
||||||
perSocketServiceTypeClients.remove(serviceTypeClient);
|
perSocketServiceTypeClients.remove(serviceTypeClient);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -330,6 +330,13 @@ public class MdnsServiceTypeClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the executor service.
|
||||||
|
*/
|
||||||
|
public ScheduledExecutorService getExecutor() {
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
|
||||||
private void removeScheduledTask() {
|
private void removeScheduledTask() {
|
||||||
dependencies.removeMessages(handler, EVENT_START_QUERYTASK);
|
dependencies.removeMessages(handler, EVENT_START_QUERYTASK);
|
||||||
sharedLog.log("Remove EVENT_START_QUERYTASK"
|
sharedLog.log("Remove EVENT_START_QUERYTASK"
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
||||||
/** Tests for {@link MdnsDiscoveryManager}. */
|
/** Tests for {@link MdnsDiscoveryManager}. */
|
||||||
@RunWith(DevSdkIgnoreRunner.class)
|
@RunWith(DevSdkIgnoreRunner.class)
|
||||||
@@ -80,6 +81,7 @@ public class MdnsDiscoveryManagerTests {
|
|||||||
private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_2_NETWORK_2 =
|
private static final Pair<String, SocketKey> PER_SOCKET_SERVICE_TYPE_2_NETWORK_2 =
|
||||||
Pair.create(SERVICE_TYPE_2, SOCKET_KEY_NETWORK_2);
|
Pair.create(SERVICE_TYPE_2, SOCKET_KEY_NETWORK_2);
|
||||||
@Mock private ExecutorProvider executorProvider;
|
@Mock private ExecutorProvider executorProvider;
|
||||||
|
@Mock private ScheduledExecutorService mockExecutorService;
|
||||||
@Mock private MdnsSocketClientBase socketClient;
|
@Mock private MdnsSocketClientBase socketClient;
|
||||||
@Mock private MdnsServiceTypeClient mockServiceTypeClientType1NullNetwork;
|
@Mock private MdnsServiceTypeClient mockServiceTypeClientType1NullNetwork;
|
||||||
@Mock private MdnsServiceTypeClient mockServiceTypeClientType1Network1;
|
@Mock private MdnsServiceTypeClient mockServiceTypeClientType1Network1;
|
||||||
@@ -128,6 +130,7 @@ public class MdnsDiscoveryManagerTests {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
doReturn(mockExecutorService).when(mockServiceTypeClientType1NullNetwork).getExecutor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -165,10 +168,24 @@ public class MdnsDiscoveryManagerTests {
|
|||||||
when(mockServiceTypeClientType1NullNetwork.stopSendAndReceive(mockListenerOne))
|
when(mockServiceTypeClientType1NullNetwork.stopSendAndReceive(mockListenerOne))
|
||||||
.thenReturn(true);
|
.thenReturn(true);
|
||||||
runOnHandler(() -> discoveryManager.unregisterListener(SERVICE_TYPE_1, mockListenerOne));
|
runOnHandler(() -> discoveryManager.unregisterListener(SERVICE_TYPE_1, mockListenerOne));
|
||||||
|
verify(executorProvider).shutdownExecutorService(mockExecutorService);
|
||||||
verify(mockServiceTypeClientType1NullNetwork).stopSendAndReceive(mockListenerOne);
|
verify(mockServiceTypeClientType1NullNetwork).stopSendAndReceive(mockListenerOne);
|
||||||
verify(socketClient).stopDiscovery();
|
verify(socketClient).stopDiscovery();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onSocketDestroy_shutdownExecutorService() throws IOException {
|
||||||
|
final MdnsSearchOptions options =
|
||||||
|
MdnsSearchOptions.newBuilder().setNetwork(null /* network */).build();
|
||||||
|
final SocketCreationCallback callback = expectSocketCreationCallback(
|
||||||
|
SERVICE_TYPE_1, mockListenerOne, options);
|
||||||
|
runOnHandler(() -> callback.onSocketCreated(SOCKET_KEY_NULL_NETWORK));
|
||||||
|
verify(mockServiceTypeClientType1NullNetwork).startSendAndReceive(mockListenerOne, options);
|
||||||
|
|
||||||
|
runOnHandler(() -> callback.onSocketDestroyed(SOCKET_KEY_NULL_NETWORK));
|
||||||
|
verify(executorProvider).shutdownExecutorService(mockExecutorService);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void registerMultipleListeners() throws IOException {
|
public void registerMultipleListeners() throws IOException {
|
||||||
final MdnsSearchOptions options =
|
final MdnsSearchOptions options =
|
||||||
|
|||||||
Reference in New Issue
Block a user