DO NOT MERGE Make NetworkLogger.mIsLoggingEnabled an AtomicBoolean

Fixes a potential race condition - when enabling/disabling the logging
some events might have been lost.

Bug: 29748723
Change-Id: I8a436d525393b2314805e287eddcea26d4ec073b
This commit is contained in:
Michal Karpinski
2016-12-15 10:30:18 +00:00
parent c75ab85cd2
commit 92cd0ce92d

View File

@@ -34,6 +34,7 @@ import com.android.server.ServiceThread;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/** /**
* A class for managing network logging. * A class for managing network logging.
@@ -49,13 +50,13 @@ final class NetworkLogger {
private IIpConnectivityMetrics mIpConnectivityMetrics; private IIpConnectivityMetrics mIpConnectivityMetrics;
private ServiceThread mHandlerThread; private ServiceThread mHandlerThread;
private NetworkLoggingHandler mNetworkLoggingHandler; private NetworkLoggingHandler mNetworkLoggingHandler;
private boolean mIsLoggingEnabled; private AtomicBoolean mIsLoggingEnabled;
private final INetdEventCallback mNetdEventCallback = new INetdEventCallback.Stub() { private final INetdEventCallback mNetdEventCallback = new INetdEventCallback.Stub() {
@Override @Override
public void onDnsEvent(String hostname, String[] ipAddresses, int ipAddressesCount, public void onDnsEvent(String hostname, String[] ipAddresses, int ipAddressesCount,
long timestamp, int uid) { long timestamp, int uid) {
if (!mIsLoggingEnabled) { if (!mIsLoggingEnabled.get()) {
return; return;
} }
DnsEvent dnsEvent = new DnsEvent(hostname, ipAddresses, ipAddressesCount, DnsEvent dnsEvent = new DnsEvent(hostname, ipAddresses, ipAddressesCount,
@@ -65,7 +66,7 @@ final class NetworkLogger {
@Override @Override
public void onConnectEvent(String ipAddr, int port, long timestamp, int uid) { public void onConnectEvent(String ipAddr, int port, long timestamp, int uid) {
if (!mIsLoggingEnabled) { if (!mIsLoggingEnabled.get()) {
return; return;
} }
ConnectEvent connectEvent = new ConnectEvent(ipAddr, port, mPm.getNameForUid(uid), ConnectEvent connectEvent = new ConnectEvent(ipAddr, port, mPm.getNameForUid(uid),
@@ -116,7 +117,7 @@ final class NetworkLogger {
mDpm); mDpm);
mNetworkLoggingHandler.scheduleBatchFinalization( mNetworkLoggingHandler.scheduleBatchFinalization(
NetworkLoggingHandler.BATCH_FINALIZATION_TIMEOUT_MS); NetworkLoggingHandler.BATCH_FINALIZATION_TIMEOUT_MS);
mIsLoggingEnabled = true; mIsLoggingEnabled.set(true);
return true; return true;
} else { } else {
return false; return false;
@@ -130,7 +131,7 @@ final class NetworkLogger {
boolean stopNetworkLogging() { boolean stopNetworkLogging() {
Log.d(TAG, "Stopping network logging"); Log.d(TAG, "Stopping network logging");
// stop the logging regardless of whether we fail to unregister listener // stop the logging regardless of whether we fail to unregister listener
mIsLoggingEnabled = false; mIsLoggingEnabled.set(false);
try { try {
if (!checkIpConnectivityMetricsService()) { if (!checkIpConnectivityMetricsService()) {
// the IIpConnectivityMetrics service should have been present at this point // the IIpConnectivityMetrics service should have been present at this point