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#ifndef ANDROID_PROCESS_INFO_SERVICE_H
1852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#define ANDROID_PROCESS_INFO_SERVICE_H
1952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
2052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <binder/IProcessInfoService.h>
2152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <utils/Errors.h>
2252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <utils/Singleton.h>
2352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#include <sys/types.h>
2452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
2552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunknamespace android {
2652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
2752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk// ----------------------------------------------------------------------
2852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
2952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunkclass ProcessInfoService : public Singleton<ProcessInfoService> {
3052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
3152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    friend class Singleton<ProcessInfoService>;
3252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    sp<IProcessInfoService> mProcessInfoService;
3352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    Mutex mProcessInfoLock;
3452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
3552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    ProcessInfoService();
3652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
3752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    status_t getProcessStatesImpl(size_t length, /*in*/ int32_t* pids, /*out*/ int32_t* states);
38b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev    status_t getProcessStatesScoresImpl(size_t length, /*in*/ int32_t* pids,
39b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev            /*out*/ int32_t* states, /*out*/ int32_t *scores);
4052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    void updateBinderLocked();
4152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
4252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    static const int BINDER_ATTEMPT_LIMIT = 5;
4352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
4452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunkpublic:
4552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
4652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    /**
4752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     * For each PID in the given "pids" input array, write the current process state
4852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     * for that process into the "states" output array, or
4952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     * ActivityManager.PROCESS_STATE_NONEXISTENT * to indicate that no process with the given PID
5052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     * exists.
5152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     *
5252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     * Returns NO_ERROR if this operation was successful, or a negative error code otherwise.
5352f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk     */
5452f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    static status_t getProcessStatesFromPids(size_t length, /*in*/ int32_t* pids,
5552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk            /*out*/ int32_t* states) {
5652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk        return ProcessInfoService::getInstance().getProcessStatesImpl(length, /*in*/ pids,
5752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk                /*out*/ states);
5852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk    }
5952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
60b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev    /**
61b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * For each PID in the given "pids" input array, write the current process state
62b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * for that process into the "states" output array, or
63b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * ActivityManager.PROCESS_STATE_NONEXISTENT * to indicate that no process with the given PID
64b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * exists. OoM scores will also be written in the "scores" output array.
65b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * Please also note that clients calling this method need to have
66b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * "GET_PROCESS_STATE_AND_OOM_SCORE" permission.
67b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     *
68b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     * Returns NO_ERROR if this operation was successful, or a negative error code otherwise.
69b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev     */
70b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev    static status_t getProcessStatesScoresFromPids(size_t length, /*in*/ int32_t* pids,
71b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev            /*out*/ int32_t* states, /*out*/ int32_t *scores) {
72b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev        return ProcessInfoService::getInstance().getProcessStatesScoresImpl(
73b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev                length, /*in*/ pids, /*out*/ states, /*out*/ scores);
74b4f33df8911e1b2804714fc4e78e8172d2eadd46Emilian Peev    }
7552f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk};
7652f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
7752f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk// ----------------------------------------------------------------------
7852f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
7952f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk}; // namespace android
8052f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
8152f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk#endif // ANDROID_PROCESS_INFO_SERVICE_H
8252f0407d6871c43d1e6502ec6754d5811c86ed82Ruben Brunk
83