xref: /aosp_15_r20/system/libhwbinder/include/hwbinder/IPCThreadState.h (revision 77b80299c8bdfeca3ae6d0ce27ae1ad3db289be3)
1*77b80299SAndroid Build Coastguard Worker /*
2*77b80299SAndroid Build Coastguard Worker  * Copyright (C) 2005 The Android Open Source Project
3*77b80299SAndroid Build Coastguard Worker  *
4*77b80299SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*77b80299SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*77b80299SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*77b80299SAndroid Build Coastguard Worker  *
8*77b80299SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*77b80299SAndroid Build Coastguard Worker  *
10*77b80299SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*77b80299SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*77b80299SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*77b80299SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*77b80299SAndroid Build Coastguard Worker  * limitations under the License.
15*77b80299SAndroid Build Coastguard Worker  */
16*77b80299SAndroid Build Coastguard Worker 
17*77b80299SAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_IPC_THREAD_STATE_H
18*77b80299SAndroid Build Coastguard Worker #define ANDROID_HARDWARE_IPC_THREAD_STATE_H
19*77b80299SAndroid Build Coastguard Worker 
20*77b80299SAndroid Build Coastguard Worker #include <utils/Errors.h>
21*77b80299SAndroid Build Coastguard Worker #include <hwbinder/Parcel.h>
22*77b80299SAndroid Build Coastguard Worker #include <hwbinder/ProcessState.h>
23*77b80299SAndroid Build Coastguard Worker #include <utils/Vector.h>
24*77b80299SAndroid Build Coastguard Worker 
25*77b80299SAndroid Build Coastguard Worker #include <functional>
26*77b80299SAndroid Build Coastguard Worker 
27*77b80299SAndroid Build Coastguard Worker // WARNING: this code is part of libhwbinder, a fork of libbinder. Generally,
28*77b80299SAndroid Build Coastguard Worker // this means that it is only relevant to HIDL. Any AIDL- or libbinder-specific
29*77b80299SAndroid Build Coastguard Worker // code should not try to use these things.
30*77b80299SAndroid Build Coastguard Worker 
31*77b80299SAndroid Build Coastguard Worker #if defined(_WIN32)
32*77b80299SAndroid Build Coastguard Worker typedef  int  uid_t;
33*77b80299SAndroid Build Coastguard Worker #endif
34*77b80299SAndroid Build Coastguard Worker 
35*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
36*77b80299SAndroid Build Coastguard Worker namespace android {
37*77b80299SAndroid Build Coastguard Worker 
38*77b80299SAndroid Build Coastguard Worker namespace hardware {
39*77b80299SAndroid Build Coastguard Worker 
40*77b80299SAndroid Build Coastguard Worker class IPCThreadState
41*77b80299SAndroid Build Coastguard Worker {
42*77b80299SAndroid Build Coastguard Worker public:
43*77b80299SAndroid Build Coastguard Worker     static  IPCThreadState*     self();
44*77b80299SAndroid Build Coastguard Worker     static  IPCThreadState*     selfOrNull();  // self(), but won't instantiate
45*77b80299SAndroid Build Coastguard Worker 
46*77b80299SAndroid Build Coastguard Worker             sp<ProcessState>    process();
47*77b80299SAndroid Build Coastguard Worker 
48*77b80299SAndroid Build Coastguard Worker             status_t            clearLastError();
49*77b80299SAndroid Build Coastguard Worker 
50*77b80299SAndroid Build Coastguard Worker             pid_t               getCallingPid() const;
51*77b80299SAndroid Build Coastguard Worker             // nullptr if unavailable
52*77b80299SAndroid Build Coastguard Worker             //
53*77b80299SAndroid Build Coastguard Worker             // this can't be restored once it's cleared, and it does not return the
54*77b80299SAndroid Build Coastguard Worker             // context of the current process when not in a binder call.
55*77b80299SAndroid Build Coastguard Worker             const char*         getCallingSid() const;
56*77b80299SAndroid Build Coastguard Worker             uid_t               getCallingUid() const;
57*77b80299SAndroid Build Coastguard Worker 
58*77b80299SAndroid Build Coastguard Worker             void                setStrictModePolicy(int32_t policy);
59*77b80299SAndroid Build Coastguard Worker             int32_t             getStrictModePolicy() const;
60*77b80299SAndroid Build Coastguard Worker 
61*77b80299SAndroid Build Coastguard Worker             void                setLastTransactionBinderFlags(int32_t flags);
62*77b80299SAndroid Build Coastguard Worker             int32_t             getLastTransactionBinderFlags() const;
63*77b80299SAndroid Build Coastguard Worker 
64*77b80299SAndroid Build Coastguard Worker             int64_t             clearCallingIdentity();
65*77b80299SAndroid Build Coastguard Worker             // Restores PID/UID (not SID)
66*77b80299SAndroid Build Coastguard Worker             void                restoreCallingIdentity(int64_t token);
67*77b80299SAndroid Build Coastguard Worker 
68*77b80299SAndroid Build Coastguard Worker             int                 setupPolling(int* fd);
69*77b80299SAndroid Build Coastguard Worker             status_t            handlePolledCommands();
70*77b80299SAndroid Build Coastguard Worker             void                flushCommands();
71*77b80299SAndroid Build Coastguard Worker 
72*77b80299SAndroid Build Coastguard Worker             void                joinThreadPool(bool isMain = true);
73*77b80299SAndroid Build Coastguard Worker 
74*77b80299SAndroid Build Coastguard Worker             // Stop the local process.
75*77b80299SAndroid Build Coastguard Worker             void                stopProcess(bool immediate = true);
76*77b80299SAndroid Build Coastguard Worker 
77*77b80299SAndroid Build Coastguard Worker             status_t            transact(int32_t handle,
78*77b80299SAndroid Build Coastguard Worker                                          uint32_t code, const Parcel& data,
79*77b80299SAndroid Build Coastguard Worker                                          Parcel* reply, uint32_t flags);
80*77b80299SAndroid Build Coastguard Worker 
81*77b80299SAndroid Build Coastguard Worker             void                incStrongHandle(int32_t handle, BpHwBinder *proxy);
82*77b80299SAndroid Build Coastguard Worker             void                decStrongHandle(int32_t handle);
83*77b80299SAndroid Build Coastguard Worker             void                incWeakHandle(int32_t handle, BpHwBinder *proxy);
84*77b80299SAndroid Build Coastguard Worker             void                decWeakHandle(int32_t handle);
85*77b80299SAndroid Build Coastguard Worker             status_t            attemptIncStrongHandle(int32_t handle);
86*77b80299SAndroid Build Coastguard Worker     static  void                expungeHandle(int32_t handle, IBinder* binder);
87*77b80299SAndroid Build Coastguard Worker             status_t            requestDeathNotification(   int32_t handle,
88*77b80299SAndroid Build Coastguard Worker                                                             BpHwBinder* proxy);
89*77b80299SAndroid Build Coastguard Worker             status_t            clearDeathNotification( int32_t handle,
90*77b80299SAndroid Build Coastguard Worker                                                         BpHwBinder* proxy);
91*77b80299SAndroid Build Coastguard Worker 
92*77b80299SAndroid Build Coastguard Worker     static  void                shutdown();
93*77b80299SAndroid Build Coastguard Worker 
94*77b80299SAndroid Build Coastguard Worker             // Service manager registration
95*77b80299SAndroid Build Coastguard Worker             void                setTheContextObject(sp<BHwBinder> obj);
96*77b80299SAndroid Build Coastguard Worker 
97*77b80299SAndroid Build Coastguard Worker             bool                isLooperThread();
98*77b80299SAndroid Build Coastguard Worker             bool                isOnlyBinderThread();
99*77b80299SAndroid Build Coastguard Worker 
100*77b80299SAndroid Build Coastguard Worker             // WARNING: DO NOT USE THIS API
101*77b80299SAndroid Build Coastguard Worker             //
102*77b80299SAndroid Build Coastguard Worker             // Returns a pointer to the stack from the last time a transaction
103*77b80299SAndroid Build Coastguard Worker             // was initiated by the kernel. Used to compare when making nested
104*77b80299SAndroid Build Coastguard Worker             // calls between multiple different transports.
105*77b80299SAndroid Build Coastguard Worker             const void*         getServingStackPointer() const;
106*77b80299SAndroid Build Coastguard Worker 
107*77b80299SAndroid Build Coastguard Worker             // Tasks which are done on the binder thread after the thread returns to the
108*77b80299SAndroid Build Coastguard Worker             // threadpool.
109*77b80299SAndroid Build Coastguard Worker             void addPostCommandTask(const std::function<void(void)>& task);
110*77b80299SAndroid Build Coastguard Worker 
111*77b80299SAndroid Build Coastguard Worker            private:
112*77b80299SAndroid Build Coastguard Worker             IPCThreadState();
113*77b80299SAndroid Build Coastguard Worker             ~IPCThreadState();
114*77b80299SAndroid Build Coastguard Worker 
115*77b80299SAndroid Build Coastguard Worker             status_t            sendReply(const Parcel& reply, uint32_t flags);
116*77b80299SAndroid Build Coastguard Worker             status_t            waitForResponse(Parcel *reply,
117*77b80299SAndroid Build Coastguard Worker                                                 status_t *acquireResult=nullptr);
118*77b80299SAndroid Build Coastguard Worker             status_t            talkWithDriver(bool doReceive=true);
119*77b80299SAndroid Build Coastguard Worker             status_t            writeTransactionData(int32_t cmd,
120*77b80299SAndroid Build Coastguard Worker                                                      uint32_t binderFlags,
121*77b80299SAndroid Build Coastguard Worker                                                      int32_t handle,
122*77b80299SAndroid Build Coastguard Worker                                                      uint32_t code,
123*77b80299SAndroid Build Coastguard Worker                                                      const Parcel& data,
124*77b80299SAndroid Build Coastguard Worker                                                      status_t* statusBuffer);
125*77b80299SAndroid Build Coastguard Worker             status_t            getAndExecuteCommand();
126*77b80299SAndroid Build Coastguard Worker             status_t            executeCommand(int32_t command);
127*77b80299SAndroid Build Coastguard Worker             void                processPendingDerefs();
128*77b80299SAndroid Build Coastguard Worker             void                processPostWriteDerefs();
129*77b80299SAndroid Build Coastguard Worker 
130*77b80299SAndroid Build Coastguard Worker             void                clearCaller();
131*77b80299SAndroid Build Coastguard Worker 
132*77b80299SAndroid Build Coastguard Worker     static  void                threadDestructor(void *st);
133*77b80299SAndroid Build Coastguard Worker     static  void                freeBuffer(Parcel* parcel,
134*77b80299SAndroid Build Coastguard Worker                                            const uint8_t* data, size_t dataSize,
135*77b80299SAndroid Build Coastguard Worker                                            const binder_size_t* objects, size_t objectsSize,
136*77b80299SAndroid Build Coastguard Worker                                            void* cookie);
137*77b80299SAndroid Build Coastguard Worker 
138*77b80299SAndroid Build Coastguard Worker     const   sp<ProcessState>    mProcess;
139*77b80299SAndroid Build Coastguard Worker             Vector<BHwBinder*>    mPendingStrongDerefs;
140*77b80299SAndroid Build Coastguard Worker             Vector<RefBase::weakref_type*> mPendingWeakDerefs;
141*77b80299SAndroid Build Coastguard Worker             Vector<RefBase*>    mPostWriteStrongDerefs;
142*77b80299SAndroid Build Coastguard Worker             Vector<RefBase::weakref_type*> mPostWriteWeakDerefs;
143*77b80299SAndroid Build Coastguard Worker             Parcel              mIn;
144*77b80299SAndroid Build Coastguard Worker             Parcel              mOut;
145*77b80299SAndroid Build Coastguard Worker             status_t            mLastError;
146*77b80299SAndroid Build Coastguard Worker             const void*         mServingStackPointer;
147*77b80299SAndroid Build Coastguard Worker             pid_t               mCallingPid;
148*77b80299SAndroid Build Coastguard Worker             const char*         mCallingSid;
149*77b80299SAndroid Build Coastguard Worker             uid_t               mCallingUid;
150*77b80299SAndroid Build Coastguard Worker             int32_t             mStrictModePolicy;
151*77b80299SAndroid Build Coastguard Worker             int32_t             mLastTransactionBinderFlags;
152*77b80299SAndroid Build Coastguard Worker             bool                mIsLooper;
153*77b80299SAndroid Build Coastguard Worker             bool mIsPollingThread;
154*77b80299SAndroid Build Coastguard Worker 
155*77b80299SAndroid Build Coastguard Worker             std::vector<std::function<void(void)>> mPostCommandTasks;
156*77b80299SAndroid Build Coastguard Worker 
157*77b80299SAndroid Build Coastguard Worker             ProcessState::CallRestriction mCallRestriction;
158*77b80299SAndroid Build Coastguard Worker };
159*77b80299SAndroid Build Coastguard Worker 
160*77b80299SAndroid Build Coastguard Worker } // namespace hardware
161*77b80299SAndroid Build Coastguard Worker } // namespace android
162*77b80299SAndroid Build Coastguard Worker 
163*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
164*77b80299SAndroid Build Coastguard Worker 
165*77b80299SAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_IPC_THREAD_STATE_H
166