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

Commit f0ef15fd authored by Brian Duddie's avatar Brian Duddie
Browse files

Handle UID state change on separate thread

UID changes are dispatched on the UI thread, so to avoid blocking in the
case that we have mutex contention due to a slow sensor HAL, queue
updates for deferred process on SensorService's looper (aka
SensorEventAckReceiver).

Bug: 399607981
Test: monitor typical UID state changes with extra debug logs
Test: manually trigger UID state changes and confirm functionality
Flag: com.android.frameworks.sensorservice.flags.use_looper_for_uid_state_change
Change-Id: I4478a628ecfc578ba6ffe5ec85a7882df8deaed4
parent c1ae85bc
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -2570,10 +2570,7 @@ void SensorService::UidPolicy::onUidActive(uid_t uid) {
        Mutex::Autolock _l(mUidLock);
        mActiveUids.insert(uid);
    }
    sp<SensorService> service = mService.promote();
    if (service != nullptr) {
        service->onUidStateChanged(uid, UID_STATE_ACTIVE);
    }
    postUidStateChanged(uid, UID_STATE_ACTIVE);
}

void SensorService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
@@ -2585,10 +2582,7 @@ void SensorService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
        }
    }
    if (deleted) {
        sp<SensorService> service = mService.promote();
        if (service != nullptr) {
            service->onUidStateChanged(uid, UID_STATE_IDLE);
        }
        postUidStateChanged(uid, UID_STATE_IDLE);
    }
}

@@ -2613,9 +2607,18 @@ void SensorService::UidPolicy::updateOverrideUid(uid_t uid, bool active, bool in
        isActive = isUidActiveLocked(uid);
    }
    if (wasActive != isActive) {
        postUidStateChanged(uid, isActive ? UID_STATE_ACTIVE : UID_STATE_IDLE);
    }
}

void SensorService::UidPolicy::postUidStateChanged(uid_t uid, UidState state) {
    sp<MessageHandler> handler = new UidStateChangeHandler(mService, uid, state);
    sp<SensorService> service = mService.promote();
    if (service != nullptr) {
            service->onUidStateChanged(uid, isActive ? UID_STATE_ACTIVE : UID_STATE_IDLE);
        if (sensorservice_flags::use_looper_for_uid_state_change()) {
            service->mLooper->sendMessage(handler, Message(0));
        } else {
            service->onUidStateChanged(uid, state);
        }
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -308,8 +308,24 @@ private:
            void addOverrideUid(uid_t uid, bool active);
            void removeOverrideUid(uid_t uid);
        private:
            class UidStateChangeHandler : public MessageHandler {
            public:
                UidStateChangeHandler(wp<SensorService> service, uid_t uid, UidState uidState)
                      : mService(service), mUid(uid), mUidState(uidState) {}
                void handleMessage(const Message& /*message*/) override {
                    sp<SensorService> service = mService.promote();
                    if (service != nullptr) {
                        service->onUidStateChanged(mUid, mUidState);
                    }
                }
            private:
                wp<SensorService> mService;
                uid_t mUid;
                UidState mUidState;
            };
            bool isUidActiveLocked(uid_t uid);
            void updateOverrideUid(uid_t uid, bool active, bool insert);
            void postUidStateChanged(uid_t uid, UidState state);

            Mutex mUidLock;
            wp<SensorService> mService;
+10 −0
Original line number Diff line number Diff line
@@ -48,3 +48,13 @@ flag {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "use_looper_for_uid_state_change"
  namespace: "sensors"
  description: "Processes UID state changes on the SensorEventAckReceiver thread instead of calling (UI) thread"
  bug: "399607981"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}
 No newline at end of file