Add new onUidProcAdjChanged callback to be consumed by the camera
service.
The camera service needs to know when individual process oom adj scores
are changed in order to address bug #124224342. When two separate
processes are displayed in split screen and focus is switched between
them, both proc states will remain the same while their oom scores
change. This is a problem if both have access to the camera - we want
only one owner of the camera stream at any given time and for the app
in focus to be the one to own it.
This patch adds a new IUidObserver registration level for individual
process oom score changes. In addition a new callback has been added to
IUidObserver to track these changes.
Change-Id: I7695165a205aaf64090016ec6e404b8ad2c33b5d
Bug: 124224342
Test: -- ActivityManagerServiceTest
-- ActivityManagerProcessStateTest
-- ActivityManagerFgsBgStartTest
-- UidObserverControllerTest
-- NetworkPolicyManagerServiceTest
-- ShortcutManagerTest2
-- HintManagerServiceTest
-- VibrationSettingsTest
-- CameraEvictionTest#testCamera2AccessCallbackInSplitMode (x100)
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index c576162..e4fb815 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -3670,7 +3670,8 @@
status_t res = mAm.linkToDeath(this);
mAm.registerUidObserver(this, ActivityManager::UID_OBSERVER_GONE
| ActivityManager::UID_OBSERVER_IDLE
- | ActivityManager::UID_OBSERVER_ACTIVE | ActivityManager::UID_OBSERVER_PROCSTATE,
+ | ActivityManager::UID_OBSERVER_ACTIVE | ActivityManager::UID_OBSERVER_PROCSTATE
+ | ActivityManager::UID_OBSERVER_PROC_OOM_ADJ,
ActivityManager::PROCESS_STATE_UNKNOWN,
String16("cameraserver"));
if (res == OK) {
@@ -3719,9 +3720,9 @@
bool procStateChange = false;
{
Mutex::Autolock _l(mUidLock);
- if ((mMonitoredUids.find(uid) != mMonitoredUids.end()) &&
- (mMonitoredUids[uid].first != procState)) {
- mMonitoredUids[uid].first = procState;
+ if (mMonitoredUids.find(uid) != mMonitoredUids.end() &&
+ mMonitoredUids[uid].procState != procState) {
+ mMonitoredUids[uid].procState = procState;
procStateChange = true;
}
}
@@ -3734,15 +3735,33 @@
}
}
+void CameraService::UidPolicy::onUidProcAdjChanged(uid_t uid) {
+ bool procAdjChange = false;
+ {
+ Mutex::Autolock _l(mUidLock);
+ if (mMonitoredUids.find(uid) != mMonitoredUids.end()) {
+ procAdjChange = true;
+ }
+ }
+
+ if (procAdjChange) {
+ sp<CameraService> service = mService.promote();
+ if (service != nullptr) {
+ service->notifyMonitoredUids();
+ }
+ }
+}
+
void CameraService::UidPolicy::registerMonitorUid(uid_t uid) {
Mutex::Autolock _l(mUidLock);
auto it = mMonitoredUids.find(uid);
if (it != mMonitoredUids.end()) {
- it->second.second++;
+ it->second.refCount++;
} else {
- mMonitoredUids.emplace(
- std::pair<uid_t, std::pair<int32_t, size_t>> (uid,
- std::pair<int32_t, size_t> (ActivityManager::PROCESS_STATE_NONEXISTENT, 1)));
+ MonitoredUid monitoredUid;
+ monitoredUid.procState = ActivityManager::PROCESS_STATE_NONEXISTENT;
+ monitoredUid.refCount = 1;
+ mMonitoredUids.emplace(std::pair<uid_t, MonitoredUid>(uid, monitoredUid));
}
}
@@ -3750,8 +3769,8 @@
Mutex::Autolock _l(mUidLock);
auto it = mMonitoredUids.find(uid);
if (it != mMonitoredUids.end()) {
- it->second.second--;
- if (it->second.second == 0) {
+ it->second.refCount--;
+ if (it->second.refCount == 0) {
mMonitoredUids.erase(it);
}
} else {
@@ -3829,7 +3848,7 @@
int32_t CameraService::UidPolicy::getProcStateLocked(uid_t uid) {
int32_t procState = ActivityManager::PROCESS_STATE_UNKNOWN;
if (mMonitoredUids.find(uid) != mMonitoredUids.end()) {
- procState = mMonitoredUids[uid].first;
+ procState = mMonitoredUids[uid].procState;
}
return procState;
}