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