Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44a6bc03 authored by Xin Guan's avatar Xin Guan
Browse files

UsageStats: Avoid holding main lock when notifying callbacks

Make sure informing the callbacks without holding the main
lock of the UsageStatsService.

Bug: 310142962
Bug: 302675504
Test: build/trace.
Change-Id: I4e9701b6a5c1657dc4303e22de5d148a68248398
parent 3a4dedd8
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ public class UsageStatsService extends SystemService implements
    static final int MSG_NOTIFY_ESTIMATED_LAUNCH_TIMES_CHANGED = 9;
    static final int MSG_UID_REMOVED = 10;
    static final int MSG_USER_STARTED = 11;
    static final int MSG_NOTIFY_USAGE_EVENT_LISTENER = 12;

    private final Object mLock = new Object();
    private Handler mHandler;
@@ -315,6 +316,16 @@ public class UsageStatsService extends SystemService implements
                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
                return true;
            }
            case MSG_NOTIFY_USAGE_EVENT_LISTENER: {
                final int userId = msg.arg1;
                final Event event = (Event) msg.obj;
                synchronized (mUsageEventListeners) {
                    final int size = mUsageEventListeners.size();
                    for (int i = 0; i < size; ++i) {
                        mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
                    }
                }
            }
        }
        return false;
    };
@@ -532,9 +543,6 @@ public class UsageStatsService extends SystemService implements
            }
            reportEvent(unlockEvent, userId);

            mIoHandler.obtainMessage(MSG_HANDLE_LAUNCH_TIME_ON_USER_UNLOCK,
                    userId, 0).sendToTarget();

            // Remove all the stats stored in system DE.
            deleteRecursively(new File(Environment.getDataSystemDeDirectory(userId), "usagestats"));

@@ -546,6 +554,8 @@ public class UsageStatsService extends SystemService implements
                userService.persistActiveStats();
            }
        }

        mIoHandler.obtainMessage(MSG_HANDLE_LAUNCH_TIME_ON_USER_UNLOCK, userId, 0).sendToTarget();
    }

    /**
@@ -1240,12 +1250,7 @@ public class UsageStatsService extends SystemService implements
            service.reportEvent(event);
        }

        synchronized (mUsageEventListeners) {
            final int size = mUsageEventListeners.size();
            for (int i = 0; i < size; ++i) {
                mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
            }
        }
        mIoHandler.obtainMessage(MSG_NOTIFY_USAGE_EVENT_LISTENER, userId, 0, event).sendToTarget();
    }

    private String getUsageSourcePackage(Event event) {