From 1f9bbc0d6b430af8a18862bed2e988cb5984bd33 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 24 Oct 2018 15:49:49 -0700 Subject: [PATCH] Sync log on IO thread Change-Id: Ifa1a0afd2faca9e992841d7fd7f79d7d1b615559 Fixes: 118428335 Test: Manual test with toggling sync and checking "dumpsys content -a" --- .../android/server/content/SyncLogger.java | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/content/SyncLogger.java b/services/core/java/com/android/server/content/SyncLogger.java index 8c35e27671eb8..5cbe5b958b7d0 100644 --- a/services/core/java/com/android/server/content/SyncLogger.java +++ b/services/core/java/com/android/server/content/SyncLogger.java @@ -20,12 +20,17 @@ import android.app.job.JobParameters; import android.os.Build; import android.os.Environment; import android.os.FileUtils; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.os.SystemProperties; import android.text.format.DateUtils; import android.util.Log; import android.util.Slog; import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.IntPair; +import com.android.server.IoThread; import libcore.io.IoUtils; @@ -65,10 +70,11 @@ public class SyncLogger { */ public static synchronized SyncLogger getInstance() { if (sInstance == null) { + final String flag = SystemProperties.get("debug.synclog"); final boolean enable = - Build.IS_DEBUGGABLE - || "1".equals(SystemProperties.get("debug.synclog")) - || Log.isLoggable(TAG, Log.VERBOSE); + (Build.IS_DEBUGGABLE + || "1".equals(flag) + || Log.isLoggable(TAG, Log.VERBOSE)) && !"0".equals(flag); if (enable) { sInstance = new RotatingFileLogger(); } else { @@ -142,8 +148,11 @@ public class SyncLogger { private static final boolean DO_LOGCAT = Log.isLoggable(TAG, Log.DEBUG); + private final MyHandler mHandler; + RotatingFileLogger() { mLogPath = new File(Environment.getDataSystemDirectory(), "syncmanager-log"); + mHandler = new MyHandler(IoThread.get().getLooper()); } @Override @@ -163,8 +172,12 @@ public class SyncLogger { if (message == null) { return; } + final long now = System.currentTimeMillis(); + mHandler.log(now, message); + } + + void logInner(long now, Object[] message) { synchronized (mLock) { - final long now = System.currentTimeMillis(); openLogLocked(now); if (mLogWriter == null) { return; // Couldn't open log file? @@ -272,5 +285,28 @@ public class SyncLogger { } catch (IOException e) { } } + + private class MyHandler extends Handler { + public static final int MSG_LOG_ID = 1; + + MyHandler(Looper looper) { + super(looper); + } + + public void log(long now, Object[] message) { + obtainMessage(MSG_LOG_ID, IntPair.first(now), IntPair.second(now), message) + .sendToTarget(); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_LOG_ID: { + logInner(IntPair.of(msg.arg1, msg.arg2), (Object[]) msg.obj); + break; + } + } + } + } } }