xref: /aosp_15_r20/system/libhwbinder/include/hwbinder/ProcessState.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_PROCESS_STATE_H
18*77b80299SAndroid Build Coastguard Worker #define ANDROID_HARDWARE_PROCESS_STATE_H
19*77b80299SAndroid Build Coastguard Worker 
20*77b80299SAndroid Build Coastguard Worker #include <hwbinder/IBinder.h>
21*77b80299SAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
22*77b80299SAndroid Build Coastguard Worker #include <utils/String8.h>
23*77b80299SAndroid Build Coastguard Worker #include <utils/String16.h>
24*77b80299SAndroid Build Coastguard Worker 
25*77b80299SAndroid Build Coastguard Worker #include <utils/threads.h>
26*77b80299SAndroid Build Coastguard Worker 
27*77b80299SAndroid Build Coastguard Worker #include <pthread.h>
28*77b80299SAndroid Build Coastguard Worker 
29*77b80299SAndroid Build Coastguard Worker // WARNING: this code is part of libhwbinder, a fork of libbinder. Generally,
30*77b80299SAndroid Build Coastguard Worker // this means that it is only relevant to HIDL. Any AIDL- or libbinder-specific
31*77b80299SAndroid Build Coastguard Worker // code should not try to use these things.
32*77b80299SAndroid Build Coastguard Worker 
33*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
34*77b80299SAndroid Build Coastguard Worker namespace android {
35*77b80299SAndroid Build Coastguard Worker namespace hardware {
36*77b80299SAndroid Build Coastguard Worker 
37*77b80299SAndroid Build Coastguard Worker class IPCThreadState;
38*77b80299SAndroid Build Coastguard Worker 
39*77b80299SAndroid Build Coastguard Worker class ProcessState : public virtual RefBase
40*77b80299SAndroid Build Coastguard Worker {
41*77b80299SAndroid Build Coastguard Worker public:
42*77b80299SAndroid Build Coastguard Worker     static  sp<ProcessState>    self();
43*77b80299SAndroid Build Coastguard Worker     static  sp<ProcessState>    selfOrNull();
44*77b80299SAndroid Build Coastguard Worker     // Note: don't call self() or selfOrNull() before initWithMmapSize()
45*77b80299SAndroid Build Coastguard Worker     // with '0' as an argument, this is the same as selfOrNull
46*77b80299SAndroid Build Coastguard Worker     static  sp<ProcessState>    initWithMmapSize(size_t mmapSize); // size in bytes
47*77b80299SAndroid Build Coastguard Worker 
48*77b80299SAndroid Build Coastguard Worker             void                startThreadPool();
49*77b80299SAndroid Build Coastguard Worker 
50*77b80299SAndroid Build Coastguard Worker             sp<IBinder>         getContextObject(const sp<IBinder>& /*caller*/);
51*77b80299SAndroid Build Coastguard Worker                                 // only call once, without creating a pool
52*77b80299SAndroid Build Coastguard Worker             void                becomeContextManager();
53*77b80299SAndroid Build Coastguard Worker 
54*77b80299SAndroid Build Coastguard Worker             sp<IBinder>         getStrongProxyForHandle(int32_t handle);
55*77b80299SAndroid Build Coastguard Worker             wp<IBinder>         getWeakProxyForHandle(int32_t handle);
56*77b80299SAndroid Build Coastguard Worker             void                expungeHandle(int32_t handle, IBinder* binder);
57*77b80299SAndroid Build Coastguard Worker 
58*77b80299SAndroid Build Coastguard Worker             void                spawnPooledThread(bool isMain);
59*77b80299SAndroid Build Coastguard Worker 
60*77b80299SAndroid Build Coastguard Worker             status_t            setThreadPoolConfiguration(size_t maxThreads, bool callerJoinsPool);
61*77b80299SAndroid Build Coastguard Worker             status_t            enableOnewaySpamDetection(bool enable);
62*77b80299SAndroid Build Coastguard Worker             size_t              getMaxThreads();
63*77b80299SAndroid Build Coastguard Worker             void                giveThreadPoolName();
64*77b80299SAndroid Build Coastguard Worker 
65*77b80299SAndroid Build Coastguard Worker             ssize_t             getKernelReferences(size_t count, uintptr_t* buf);
66*77b80299SAndroid Build Coastguard Worker                                 // This refcount includes:
67*77b80299SAndroid Build Coastguard Worker                                 // 1. Strong references to the node by this  and other processes
68*77b80299SAndroid Build Coastguard Worker                                 // 2. Temporary strong references held by the kernel during a
69*77b80299SAndroid Build Coastguard Worker                                 //    transaction on the node.
70*77b80299SAndroid Build Coastguard Worker                                 // It does NOT include local strong references to the node
71*77b80299SAndroid Build Coastguard Worker             ssize_t             getStrongRefCountForNodeByHandle(int32_t handle);
72*77b80299SAndroid Build Coastguard Worker             size_t              getMmapSize();
73*77b80299SAndroid Build Coastguard Worker 
74*77b80299SAndroid Build Coastguard Worker             enum class CallRestriction {
75*77b80299SAndroid Build Coastguard Worker                 // all calls okay
76*77b80299SAndroid Build Coastguard Worker                 NONE,
77*77b80299SAndroid Build Coastguard Worker                 // log when calls are blocking
78*77b80299SAndroid Build Coastguard Worker                 ERROR_IF_NOT_ONEWAY,
79*77b80299SAndroid Build Coastguard Worker                 // abort process on blocking calls
80*77b80299SAndroid Build Coastguard Worker                 FATAL_IF_NOT_ONEWAY,
81*77b80299SAndroid Build Coastguard Worker             };
82*77b80299SAndroid Build Coastguard Worker             // Sets calling restrictions for all transactions in this process. This must be called
83*77b80299SAndroid Build Coastguard Worker             // before any threads are spawned.
84*77b80299SAndroid Build Coastguard Worker             void setCallRestriction(CallRestriction restriction);
85*77b80299SAndroid Build Coastguard Worker 
86*77b80299SAndroid Build Coastguard Worker private:
87*77b80299SAndroid Build Coastguard Worker     static  sp<ProcessState>    init(size_t mmapSize, bool requireMmapSize);
88*77b80299SAndroid Build Coastguard Worker 
89*77b80299SAndroid Build Coastguard Worker     friend class IPCThreadState;
90*77b80299SAndroid Build Coastguard Worker             explicit            ProcessState(size_t mmapSize);
91*77b80299SAndroid Build Coastguard Worker                                 ~ProcessState();
92*77b80299SAndroid Build Coastguard Worker 
93*77b80299SAndroid Build Coastguard Worker                                 ProcessState(const ProcessState& o);
94*77b80299SAndroid Build Coastguard Worker             ProcessState&       operator=(const ProcessState& o);
95*77b80299SAndroid Build Coastguard Worker             String8             makeBinderThreadName();
96*77b80299SAndroid Build Coastguard Worker 
97*77b80299SAndroid Build Coastguard Worker             struct handle_entry {
98*77b80299SAndroid Build Coastguard Worker                 IBinder* binder;
99*77b80299SAndroid Build Coastguard Worker                 RefBase::weakref_type* refs;
100*77b80299SAndroid Build Coastguard Worker             };
101*77b80299SAndroid Build Coastguard Worker 
102*77b80299SAndroid Build Coastguard Worker             handle_entry*       lookupHandleLocked(int32_t handle);
103*77b80299SAndroid Build Coastguard Worker 
104*77b80299SAndroid Build Coastguard Worker             int                 mDriverFD;
105*77b80299SAndroid Build Coastguard Worker             void*               mVMStart;
106*77b80299SAndroid Build Coastguard Worker 
107*77b80299SAndroid Build Coastguard Worker             // Protects thread count variable below.
108*77b80299SAndroid Build Coastguard Worker             pthread_mutex_t     mThreadCountLock;
109*77b80299SAndroid Build Coastguard Worker             // Number of binder threads current executing a command.
110*77b80299SAndroid Build Coastguard Worker             size_t              mExecutingThreadsCount;
111*77b80299SAndroid Build Coastguard Worker             // Maximum number for binder threads allowed for this process.
112*77b80299SAndroid Build Coastguard Worker             size_t              mMaxThreads;
113*77b80299SAndroid Build Coastguard Worker             // Time when thread pool was emptied
114*77b80299SAndroid Build Coastguard Worker             int64_t             mStarvationStartTimeMs;
115*77b80299SAndroid Build Coastguard Worker 
116*77b80299SAndroid Build Coastguard Worker     mutable Mutex               mLock;  // protects everything below.
117*77b80299SAndroid Build Coastguard Worker 
118*77b80299SAndroid Build Coastguard Worker             Vector<handle_entry>mHandleToObject;
119*77b80299SAndroid Build Coastguard Worker 
120*77b80299SAndroid Build Coastguard Worker             String8             mRootDir;
121*77b80299SAndroid Build Coastguard Worker             bool                mThreadPoolStarted;
122*77b80299SAndroid Build Coastguard Worker             bool                mSpawnThreadOnStart;
123*77b80299SAndroid Build Coastguard Worker     volatile int32_t            mThreadPoolSeq;
124*77b80299SAndroid Build Coastguard Worker             const size_t        mMmapSize;
125*77b80299SAndroid Build Coastguard Worker 
126*77b80299SAndroid Build Coastguard Worker             CallRestriction     mCallRestriction;
127*77b80299SAndroid Build Coastguard Worker };
128*77b80299SAndroid Build Coastguard Worker 
129*77b80299SAndroid Build Coastguard Worker } // namespace hardware
130*77b80299SAndroid Build Coastguard Worker } // namespace android
131*77b80299SAndroid Build Coastguard Worker 
132*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
133*77b80299SAndroid Build Coastguard Worker 
134*77b80299SAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_PROCESS_STATE_H
135