blob: de126d5301e4405b275d2856641ea0ef62e7e08b [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2005 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#ifndef ANDROID_IPC_THREAD_STATE_H
18#define ANDROID_IPC_THREAD_STATE_H
19
20#include <utils/Errors.h>
Mathias Agopianc5b2c0b2009-05-19 19:08:10 -070021#include <binder/Parcel.h>
22#include <binder/ProcessState.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080023#include <utils/Vector.h>
24
Yabin Cui0dd549a2014-11-11 09:26:00 -080025#if defined(_WIN32)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080026typedef int uid_t;
27#endif
28
29// ---------------------------------------------------------------------------
30namespace android {
31
Jayant Chowdharydac6dc82018-10-01 22:52:44 +000032class IPCThreadStateBase;
33
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080034class IPCThreadState
35{
36public:
37 static IPCThreadState* self();
Brad Fitzpatrick1b608432010-12-13 16:52:35 -080038 static IPCThreadState* selfOrNull(); // self(), but won't instantiate
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080039
40 sp<ProcessState> process();
41
42 status_t clearLastError();
43
Dan Stoza9c634fd2014-11-26 12:23:23 -080044 pid_t getCallingPid() const;
45 uid_t getCallingUid() const;
Brad Fitzpatrick702ea9d2010-06-18 13:07:53 -070046
47 void setStrictModePolicy(int32_t policy);
48 int32_t getStrictModePolicy() const;
Brad Fitzpatrick52736032010-08-30 16:01:16 -070049
Olivier Gaillarda8e7bf22018-11-14 15:35:50 +000050 // See Binder#setCallingWorkSourceUid in Binder.java.
51 int64_t setCallingWorkSourceUid(uid_t uid);
52 // See Binder#getCallingWorkSourceUid in Binder.java.
53 uid_t getCallingWorkSourceUid() const;
54 // See Binder#clearCallingWorkSource in Binder.java.
55 int64_t clearCallingWorkSource();
56 // See Binder#restoreCallingWorkSource in Binder.java.
57 void restoreCallingWorkSource(int64_t token);
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +010058
Brad Fitzpatrick52736032010-08-30 16:01:16 -070059 void setLastTransactionBinderFlags(int32_t flags);
60 int32_t getLastTransactionBinderFlags() const;
61
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080062 int64_t clearCallingIdentity();
63 void restoreCallingIdentity(int64_t token);
64
Todd Poynor8d96cab2013-06-25 19:12:18 -070065 int setupPolling(int* fd);
66 status_t handlePolledCommands();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080067 void flushCommands();
68
69 void joinThreadPool(bool isMain = true);
70
71 // Stop the local process.
72 void stopProcess(bool immediate = true);
73
74 status_t transact(int32_t handle,
75 uint32_t code, const Parcel& data,
76 Parcel* reply, uint32_t flags);
77
Martijn Coenen7c170bb2018-05-04 17:28:55 -070078 void incStrongHandle(int32_t handle, BpBinder *proxy);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080079 void decStrongHandle(int32_t handle);
Martijn Coenen7c170bb2018-05-04 17:28:55 -070080 void incWeakHandle(int32_t handle, BpBinder *proxy);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080081 void decWeakHandle(int32_t handle);
82 status_t attemptIncStrongHandle(int32_t handle);
83 static void expungeHandle(int32_t handle, IBinder* binder);
84 status_t requestDeathNotification( int32_t handle,
85 BpBinder* proxy);
86 status_t clearDeathNotification( int32_t handle,
87 BpBinder* proxy);
88
89 static void shutdown();
Wale Ogunwale376b8222015-04-13 16:16:10 -070090
Dianne Hackborn8c6cedc2009-12-07 17:59:37 -080091 // Call this to disable switching threads to background scheduling when
92 // receiving incoming IPC calls. This is specifically here for the
93 // Android system process, since it expects to have background apps calling
94 // in to it but doesn't want to acquire locks in its services while in
95 // the background.
96 static void disableBackgroundScheduling(bool disable);
Martijn Coenen2b631742017-05-05 11:16:59 -070097 bool backgroundSchedulingDisabled();
Wale Ogunwale376b8222015-04-13 16:16:10 -070098
99 // Call blocks until the number of executing binder threads is less than
100 // the maximum number of binder threads threads allowed for this process.
101 void blockUntilThreadAvailable();
102
Jayant Chowdharydac6dc82018-10-01 22:52:44 +0000103
104 // Is this thread currently serving a binder call. This method
105 // returns true if while traversing backwards from the function call
106 // stack for this thread, we encounter a function serving a binder
107 // call before encountering a hwbinder call / hitting the end of the
108 // call stack.
109 // Eg: If thread T1 went through the following call pattern
110 // 1) T1 receives and executes hwbinder call H1.
111 // 2) While handling H1, T1 makes binder call B1.
112 // 3) The handler of B1, calls into T1 with a callback B2.
113 // If isServingCall() is called during H1 before 3), this method
114 // will return false, else true.
115 //
116 // ----
117 // | B2 | ---> While callback B2 is being handled, during 3).
118 // ----
119 // | H1 | ---> While H1 is being handled.
120 // ----
121 // Fig: Thread Call stack while handling B2
122 //
123 // This is since after 3), while traversing the thread call stack,
124 // we hit a binder call before a hwbinder call / end of stack. This
125 // method may be typically used to determine whether to use
126 // hardware::IPCThreadState methods or IPCThreadState methods to
127 // infer information about thread state.
128 bool isServingCall() const;
129
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800130private:
131 IPCThreadState();
132 ~IPCThreadState();
133
Martijn Coenenea0090a2017-11-02 18:54:40 +0000134 status_t sendReply(const Parcel& reply, uint32_t flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800135 status_t waitForResponse(Parcel *reply,
Yi Kong87d465c2018-07-24 01:14:06 -0700136 status_t *acquireResult=nullptr);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800137 status_t talkWithDriver(bool doReceive=true);
138 status_t writeTransactionData(int32_t cmd,
139 uint32_t binderFlags,
140 int32_t handle,
141 uint32_t code,
142 const Parcel& data,
143 status_t* statusBuffer);
Todd Poynor8d96cab2013-06-25 19:12:18 -0700144 status_t getAndExecuteCommand();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800145 status_t executeCommand(int32_t command);
Todd Poynor8d96cab2013-06-25 19:12:18 -0700146 void processPendingDerefs();
Martijn Coenen7c170bb2018-05-04 17:28:55 -0700147 void processPostWriteDerefs();
Wale Ogunwale376b8222015-04-13 16:16:10 -0700148
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800149 void clearCaller();
Wale Ogunwale376b8222015-04-13 16:16:10 -0700150
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800151 static void threadDestructor(void *st);
152 static void freeBuffer(Parcel* parcel,
153 const uint8_t* data, size_t dataSize,
Arve Hjønnevåg84e625a2014-01-28 20:12:59 -0800154 const binder_size_t* objects, size_t objectsSize,
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800155 void* cookie);
156
157 const sp<ProcessState> mProcess;
158 Vector<BBinder*> mPendingStrongDerefs;
159 Vector<RefBase::weakref_type*> mPendingWeakDerefs;
Martijn Coenen7c170bb2018-05-04 17:28:55 -0700160 Vector<RefBase*> mPostWriteStrongDerefs;
161 Vector<RefBase::weakref_type*> mPostWriteWeakDerefs;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800162 Parcel mIn;
163 Parcel mOut;
164 status_t mLastError;
165 pid_t mCallingPid;
166 uid_t mCallingUid;
Olivier Gaillard0e0f1de2018-08-16 14:04:09 +0100167 // The UID of the process who is responsible for this transaction.
168 // This is used for resource attribution.
169 int32_t mWorkSource;
Brad Fitzpatrick702ea9d2010-06-18 13:07:53 -0700170 int32_t mStrictModePolicy;
Brad Fitzpatrick52736032010-08-30 16:01:16 -0700171 int32_t mLastTransactionBinderFlags;
Jayant Chowdharydac6dc82018-10-01 22:52:44 +0000172 IPCThreadStateBase *mIPCThreadStateBase;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800173};
Brad Fitzpatrick702ea9d2010-06-18 13:07:53 -0700174
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800175}; // namespace android
176
177// ---------------------------------------------------------------------------
178
179#endif // ANDROID_IPC_THREAD_STATE_H