Loading packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsFactory.java +14 −12 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ import static android.net.NetworkStats.UID_ALL; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkStats; import android.net.UnderlyingNetworkInfo; import android.os.ServiceSpecificException; import android.os.StrictMode; import android.os.SystemClock; Loading @@ -35,6 +35,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ProcFileReader; import com.android.net.module.util.CollectionUtils; import com.android.server.BpfNetMaps; import libcore.io.IoUtils; Loading Loading @@ -74,6 +75,8 @@ public class NetworkStatsFactory { private final Context mContext; private final BpfNetMaps mBpfNetMaps; /** * Guards persistent data access in this class * Loading Loading @@ -170,6 +173,7 @@ public class NetworkStatsFactory { mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt"); mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats"); mUseBpfStats = useBpfStats; mBpfNetMaps = new BpfNetMaps(); synchronized (mPersistentDataLock) { mPersistSnapshot = new NetworkStats(SystemClock.elapsedRealtime(), -1); mTunAnd464xlatAdjustedStats = new NetworkStats(SystemClock.elapsedRealtime(), -1); Loading Loading @@ -297,12 +301,14 @@ public class NetworkStatsFactory { } @GuardedBy("mPersistentDataLock") private void requestSwapActiveStatsMapLocked() { // Do a active map stats swap. When the binder call successfully returns, // the system server should be able to safely read and clean the inactive map // without race problem. final ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); cm.swapActiveStatsMap(); private void requestSwapActiveStatsMapLocked() throws IOException { try { // Do a active map stats swap. Once the swap completes, this code // can read and clean the inactive map without races. mBpfNetMaps.swapActiveStatsMap(); } catch (ServiceSpecificException e) { throw new IOException(e); } } /** Loading @@ -328,11 +334,7 @@ public class NetworkStatsFactory { final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0 /* initialSize */); if (mUseBpfStats) { try { requestSwapActiveStatsMapLocked(); } catch (RuntimeException e) { throw new IOException(e); } // Stats are always read from the inactive map, so they must be read after the // swap if (nativeReadNetworkStatsDetail(stats, mStatsXtUid.getAbsolutePath(), UID_ALL, Loading Loading
packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsFactory.java +14 −12 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ import static android.net.NetworkStats.UID_ALL; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkStats; import android.net.UnderlyingNetworkInfo; import android.os.ServiceSpecificException; import android.os.StrictMode; import android.os.SystemClock; Loading @@ -35,6 +35,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ProcFileReader; import com.android.net.module.util.CollectionUtils; import com.android.server.BpfNetMaps; import libcore.io.IoUtils; Loading Loading @@ -74,6 +75,8 @@ public class NetworkStatsFactory { private final Context mContext; private final BpfNetMaps mBpfNetMaps; /** * Guards persistent data access in this class * Loading Loading @@ -170,6 +173,7 @@ public class NetworkStatsFactory { mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt"); mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats"); mUseBpfStats = useBpfStats; mBpfNetMaps = new BpfNetMaps(); synchronized (mPersistentDataLock) { mPersistSnapshot = new NetworkStats(SystemClock.elapsedRealtime(), -1); mTunAnd464xlatAdjustedStats = new NetworkStats(SystemClock.elapsedRealtime(), -1); Loading Loading @@ -297,12 +301,14 @@ public class NetworkStatsFactory { } @GuardedBy("mPersistentDataLock") private void requestSwapActiveStatsMapLocked() { // Do a active map stats swap. When the binder call successfully returns, // the system server should be able to safely read and clean the inactive map // without race problem. final ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); cm.swapActiveStatsMap(); private void requestSwapActiveStatsMapLocked() throws IOException { try { // Do a active map stats swap. Once the swap completes, this code // can read and clean the inactive map without races. mBpfNetMaps.swapActiveStatsMap(); } catch (ServiceSpecificException e) { throw new IOException(e); } } /** Loading @@ -328,11 +334,7 @@ public class NetworkStatsFactory { final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0 /* initialSize */); if (mUseBpfStats) { try { requestSwapActiveStatsMapLocked(); } catch (RuntimeException e) { throw new IOException(e); } // Stats are always read from the inactive map, so they must be read after the // swap if (nativeReadNetworkStatsDetail(stats, mStatsXtUid.getAbsolutePath(), UID_ALL, Loading