114bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu/* 214bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * Copyright (C) 2015 The Android Open Source Project 314bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * 414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * Licensed under the Apache License, Version 2.0 (the "License"); 514bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * you may not use this file except in compliance with the License. 614bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * You may obtain a copy of the License at 714bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * 814bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * http://www.apache.org/licenses/LICENSE-2.0 914bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * 1014bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * Unless required by applicable law or agreed to in writing, software 1114bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * distributed under the License is distributed on an "AS IS" BASIS, 1214bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * See the License for the specific language governing permissions and 1414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu * limitations under the License. 1514bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu */ 1614bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 1714bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu//#define LOG_NDEBUG 0 1814bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu#define LOG_TAG "ProcessInfo" 1914bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu#include <utils/Log.h> 2014bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 2114bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu#include <media/stagefright/ProcessInfo.h> 2214bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 23d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu#include <binder/IPCThreadState.h> 2414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu#include <binder/IProcessInfoService.h> 2514bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu#include <binder/IServiceManager.h> 2614bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 2714bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wunamespace android { 2814bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 2914bcacaed718a506f59e8f3af66e9e0137789da6Ronghua WuProcessInfo::ProcessInfo() {} 3014bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 3114bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wubool ProcessInfo::getPriority(int pid, int* priority) { 3214bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu sp<IBinder> binder = defaultServiceManager()->getService(String16("processinfo")); 3314bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu sp<IProcessInfoService> service = interface_cast<IProcessInfoService>(binder); 3414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 3514bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu size_t length = 1; 36221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu int32_t state; 37221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu static const int32_t INVALID_ADJ = -10000; 38221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu static const int32_t NATIVE_ADJ = -1000; 39221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu int32_t score = INVALID_ADJ; 40221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu status_t err = service->getProcessStatesAndOomScoresFromPids(length, &pid, &state, &score); 4114bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu if (err != OK) { 42221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu ALOGE("getProcessStatesAndOomScoresFromPids failed"); 4314bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu return false; 4414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu } 45221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu ALOGV("pid %d state %d score %d", pid, state, score); 46221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu if (score <= NATIVE_ADJ) { 47221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu ALOGE("pid %d invalid OOM adjustments value %d", pid, score); 4814bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu return false; 4914bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu } 5014bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 51221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu // Use OOM adjustments value as the priority. Lower the value, higher the priority. 52221761b3aa3fb5b0160dfef3bab414fcc348dd56Ronghua Wu *priority = score; 5314bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu return true; 5414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu} 5514bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 56d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wubool ProcessInfo::isValidPid(int pid) { 57d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu int callingPid = IPCThreadState::self()->getCallingPid(); 58d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu // Trust it if this is called from the same process otherwise pid has to match the calling pid. 59d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu return (callingPid == getpid()) || (callingPid == pid); 60d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu} 61d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu 6214bcacaed718a506f59e8f3af66e9e0137789da6Ronghua WuProcessInfo::~ProcessInfo() {} 6314bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu 6414bcacaed718a506f59e8f3af66e9e0137789da6Ronghua Wu} // namespace android 65