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