152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk/* 252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * Copyright 2015 The Android Open Source Project 352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * 452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * you may not use this file except in compliance with the License. 652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * You may obtain a copy of the License at 752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * 852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * 1052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * Unless required by applicable law or agreed to in writing, software 1152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 1252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * See the License for the specific language governing permissions and 1452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk * limitations under the License. 1552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk */ 1652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 1752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <binder/IProcessInfoService.h> 1852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <binder/Parcel.h> 1952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <utils/Errors.h> 2052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <sys/types.h> 2152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 2252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunknamespace android { 2352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 2452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk// ---------------------------------------------------------------------- 2552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 2652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunkclass BpProcessInfoService : public BpInterface<IProcessInfoService> { 2752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunkpublic: 28e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpProcessInfoService(const sp<IBinder>& impl) 2952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk : BpInterface<IProcessInfoService>(impl) {} 3052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 3152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk virtual status_t getProcessStatesFromPids(size_t length, /*in*/ int32_t* pids, 3252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk /*out*/ int32_t* states) 3352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk { 3452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk Parcel data, reply; 3552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk data.writeInterfaceToken(IProcessInfoService::getInterfaceDescriptor()); 3652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk data.writeInt32Array(length, pids); 3752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk data.writeInt32(length); // write length of output array, used by java AIDL stubs 3852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk status_t err = remote()->transact(GET_PROCESS_STATES_FROM_PIDS, data, &reply); 3952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 4052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk return err; 4152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk } 4252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk int32_t replyLen = reply.readInt32(); 4352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk if (static_cast<size_t>(replyLen) != length) { 4452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk return NOT_ENOUGH_DATA; 4552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk } 4652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk if (replyLen > 0 && (err = reply.read(states, length * sizeof(*states))) != NO_ERROR) { 4752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk return err; 4852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk } 4952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk return reply.readInt32(); 5052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk } 5152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 52c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang virtual status_t getProcessStatesAndOomScoresFromPids(size_t length, 53c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang /*in*/ int32_t* pids, /*out*/ int32_t* states, /*out*/ int32_t* scores) 54c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang { 55c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang Parcel data, reply; 56c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang data.writeInterfaceToken(IProcessInfoService::getInterfaceDescriptor()); 57c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang data.writeInt32Array(length, pids); 58c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang // write length of output arrays, used by java AIDL stubs 59c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang data.writeInt32(length); 60c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang data.writeInt32(length); 61c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang status_t err = remote()->transact( 62c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang GET_PROCESS_STATES_AND_OOM_SCORES_FROM_PIDS, data, &reply); 63c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang if (err != NO_ERROR 64c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang || ((err = reply.readExceptionCode()) != NO_ERROR)) { 65c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang return err; 66c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang } 67c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang int32_t replyLen = reply.readInt32(); 68c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang if (static_cast<size_t>(replyLen) != length) { 69c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang return NOT_ENOUGH_DATA; 70c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang } 71c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang if (replyLen > 0 && (err = reply.read( 72c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang states, length * sizeof(*states))) != NO_ERROR) { 73c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang return err; 74c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang } 75c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang replyLen = reply.readInt32(); 76c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang if (static_cast<size_t>(replyLen) != length) { 77c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang return NOT_ENOUGH_DATA; 78c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang } 79c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang if (replyLen > 0 && (err = reply.read( 80c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang scores, length * sizeof(*scores))) != NO_ERROR) { 81c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang return err; 82c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang } 83c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang return reply.readInt32(); 84c72a90a335556be566628e1b0a76b3bd818498b4Chong Zhang } 8552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk}; 8652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 8752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben BrunkIMPLEMENT_META_INTERFACE(ProcessInfoService, "android.os.IProcessInfoService"); 8852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 8952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk// ---------------------------------------------------------------------- 9052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk 9152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk}; // namespace android 92