summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorErik Kline <ek@google.com>2015-05-20 03:26:12 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-05-20 03:26:14 +0000
commit77b01b887670b01f543558cd5cfd7d5d228d6c21 (patch)
tree61224e9ed9b5b77d0ee57653bcf80dfdb624080b /core
parent1c5bf7f1ddc8c9c9844a1bc1a7e4ce53dcc5d5bd (diff)
parentabd3142dcae02026689b939c363329b822b7cc0a (diff)
downloadframeworks_base-77b01b887670b01f543558cd5cfd7d5d228d6c21.zip
frameworks_base-77b01b887670b01f543558cd5cfd7d5d228d6c21.tar.gz
frameworks_base-77b01b887670b01f543558cd5cfd7d5d228d6c21.tar.bz2
Merge "Close netlink socket when shutting down IpReachabilityMonitor" into mnc-dev
Diffstat (limited to 'core')
-rw-r--r--core/java/android/net/IpReachabilityMonitor.java15
-rw-r--r--core/tests/coretests/src/android/net/netlink/NetlinkSocketTest.java23
2 files changed, 31 insertions, 7 deletions
diff --git a/core/java/android/net/IpReachabilityMonitor.java b/core/java/android/net/IpReachabilityMonitor.java
index add8774..cb8c866 100644
--- a/core/java/android/net/IpReachabilityMonitor.java
+++ b/core/java/android/net/IpReachabilityMonitor.java
@@ -73,7 +73,8 @@ public class IpReachabilityMonitor {
private final Set<InetAddress> mIpWatchList;
private int mIpWatchListVersion;
private boolean mRunning;
- final private Thread mObserverThread;
+ private final NetlinkSocketObserver mNetlinkSocketObserver;
+ private final Thread mObserverThread;
public IpReachabilityMonitor(String ifName, Callback callback) throws IllegalArgumentException {
mInterfaceName = ifName;
@@ -88,15 +89,15 @@ public class IpReachabilityMonitor {
mIpWatchList = new HashSet<InetAddress>();
mIpWatchListVersion = 0;
mRunning = false;
- mObserverThread = new Thread(new NetlinkSocketObserver());
+ mNetlinkSocketObserver = new NetlinkSocketObserver();
+ mObserverThread = new Thread(mNetlinkSocketObserver);
mObserverThread.start();
}
public void stop() {
- synchronized (mLock) {
- mRunning = false;
- mIpWatchList.clear();
- }
+ synchronized (mLock) { mRunning = false; }
+ clearLinkProperties();
+ mNetlinkSocketObserver.clearNetlinkSocket();
}
// TODO: add a public dump() method that can be called during a bug report.
@@ -251,6 +252,7 @@ public class IpReachabilityMonitor {
}
+ // TODO: simply the number of objects by making this extend Thread.
private final class NetlinkSocketObserver implements Runnable {
private static final String TAG = "NetlinkSocketObserver";
private NetlinkSocket mSocket;
@@ -292,7 +294,6 @@ public class IpReachabilityMonitor {
if (mSocket != null) {
mSocket.close();
}
- mSocket = null;
}
// TODO: Refactor the main loop to recreate the socket upon recoverable errors.
diff --git a/core/tests/coretests/src/android/net/netlink/NetlinkSocketTest.java b/core/tests/coretests/src/android/net/netlink/NetlinkSocketTest.java
index b32de78..c599fe3 100644
--- a/core/tests/coretests/src/android/net/netlink/NetlinkSocketTest.java
+++ b/core/tests/coretests/src/android/net/netlink/NetlinkSocketTest.java
@@ -90,4 +90,27 @@ public class NetlinkSocketTest extends TestCase {
s.close();
}
+
+ public void testRepeatedCloseCallsAreQuiet() throws Exception {
+ // Create a working NetlinkSocket.
+ NetlinkSocket s = new NetlinkSocket(OsConstants.NETLINK_ROUTE);
+ assertNotNull(s);
+ s.connectToKernel();
+ NetlinkSocketAddress localAddr = s.getLocalAddress();
+ assertNotNull(localAddr);
+ assertEquals(0, localAddr.getGroupsMask());
+ assertTrue(0 != localAddr.getPortId());
+ // Close once.
+ s.close();
+ // Test that it is closed.
+ boolean expectedErrorSeen = false;
+ try {
+ localAddr = s.getLocalAddress();
+ } catch (ErrnoException e) {
+ expectedErrorSeen = true;
+ }
+ assertTrue(expectedErrorSeen);
+ // Close once more.
+ s.close();
+ }
}