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