• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <binder/IProcessInfoService.h>
18 #include <binder/Parcel.h>
19 #include <utils/Errors.h>
20 #include <sys/types.h>
21 
22 namespace android {
23 
24 // ----------------------------------------------------------------------
25 
26 class BpProcessInfoService : public BpInterface<IProcessInfoService> {
27 public:
BpProcessInfoService(const sp<IBinder> & impl)28     explicit BpProcessInfoService(const sp<IBinder>& impl)
29         : BpInterface<IProcessInfoService>(impl) {}
30 
getProcessStatesFromPids(size_t length,int32_t * pids,int32_t * states)31     virtual status_t getProcessStatesFromPids(size_t length, /*in*/ int32_t* pids,
32             /*out*/ int32_t* states)
33     {
34         Parcel data, reply;
35         data.writeInterfaceToken(IProcessInfoService::getInterfaceDescriptor());
36         data.writeInt32Array(length, pids);
37         data.writeInt32(length); // write length of output array, used by java AIDL stubs
38         status_t err = remote()->transact(GET_PROCESS_STATES_FROM_PIDS, data, &reply);
39         if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
40             return err;
41         }
42         int32_t replyLen = reply.readInt32();
43         if (static_cast<size_t>(replyLen) != length) {
44             return NOT_ENOUGH_DATA;
45         }
46         if (replyLen > 0 && (err = reply.read(states, length * sizeof(*states))) != NO_ERROR) {
47             return err;
48         }
49         return reply.readInt32();
50     }
51 
getProcessStatesAndOomScoresFromPids(size_t length,int32_t * pids,int32_t * states,int32_t * scores)52     virtual status_t getProcessStatesAndOomScoresFromPids(size_t length,
53             /*in*/ int32_t* pids, /*out*/ int32_t* states, /*out*/ int32_t* scores)
54     {
55         Parcel data, reply;
56         data.writeInterfaceToken(IProcessInfoService::getInterfaceDescriptor());
57         data.writeInt32Array(length, pids);
58         // write length of output arrays, used by java AIDL stubs
59         data.writeInt32(length);
60         data.writeInt32(length);
61         status_t err = remote()->transact(
62                 GET_PROCESS_STATES_AND_OOM_SCORES_FROM_PIDS, data, &reply);
63         if (err != NO_ERROR
64                 || ((err = reply.readExceptionCode()) != NO_ERROR)) {
65             return err;
66         }
67         int32_t replyLen = reply.readInt32();
68         if (static_cast<size_t>(replyLen) != length) {
69             return NOT_ENOUGH_DATA;
70         }
71         if (replyLen > 0 && (err = reply.read(
72                 states, length * sizeof(*states))) != NO_ERROR) {
73             return err;
74         }
75         replyLen = reply.readInt32();
76         if (static_cast<size_t>(replyLen) != length) {
77             return NOT_ENOUGH_DATA;
78         }
79         if (replyLen > 0 && (err = reply.read(
80                 scores, length * sizeof(*scores))) != NO_ERROR) {
81             return err;
82         }
83         return reply.readInt32();
84     }
85 };
86 
87 IMPLEMENT_META_INTERFACE(ProcessInfoService, "android.os.IProcessInfoService");
88 
89 // ----------------------------------------------------------------------
90 
91 }; // namespace android
92