Home | History | Annotate | Download | only in binder
      1 /*
      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_PROCESS_STATE_H
     18 #define ANDROID_PROCESS_STATE_H
     19 
     20 #include <binder/IBinder.h>
     21 #include <utils/KeyedVector.h>
     22 #include <utils/String8.h>
     23 #include <utils/String16.h>
     24 
     25 #include <utils/threads.h>
     26 
     27 #include <pthread.h>
     28 
     29 // ---------------------------------------------------------------------------
     30 namespace android {
     31 
     32 class IPCThreadState;
     33 
     34 class ProcessState : public virtual RefBase
     35 {
     36 public:
     37     static  sp<ProcessState>    self();
     38     static  sp<ProcessState>    selfOrNull();
     39 
     40     /* initWithDriver() can be used to configure libbinder to use
     41      * a different binder driver dev node. It must be called *before*
     42      * any call to ProcessState::self(). The default is /dev/vndbinder
     43      * for processes built with the VNDK and /dev/binder for those
     44      * which are not.
     45      */
     46     static  sp<ProcessState>    initWithDriver(const char *driver);
     47 
     48             void                setContextObject(const sp<IBinder>& object);
     49             sp<IBinder>         getContextObject(const sp<IBinder>& caller);
     50 
     51             void                setContextObject(const sp<IBinder>& object,
     52                                                  const String16& name);
     53             sp<IBinder>         getContextObject(const String16& name,
     54                                                  const sp<IBinder>& caller);
     55 
     56             void                startThreadPool();
     57 
     58     typedef bool (*context_check_func)(const String16& name,
     59                                        const sp<IBinder>& caller,
     60                                        void* userData);
     61 
     62             bool                isContextManager(void) const;
     63             bool                becomeContextManager(
     64                                     context_check_func checkFunc,
     65                                     void* userData);
     66 
     67             sp<IBinder>         getStrongProxyForHandle(int32_t handle);
     68             wp<IBinder>         getWeakProxyForHandle(int32_t handle);
     69             void                expungeHandle(int32_t handle, IBinder* binder);
     70 
     71             void                spawnPooledThread(bool isMain);
     72 
     73             status_t            setThreadPoolMaxThreadCount(size_t maxThreads);
     74             void                giveThreadPoolName();
     75 
     76             String8             getDriverName();
     77 
     78             ssize_t             getKernelReferences(size_t count, uintptr_t* buf);
     79 
     80             enum class CallRestriction {
     81                 // all calls okay
     82                 NONE,
     83                 // log when calls are blocking
     84                 ERROR_IF_NOT_ONEWAY,
     85                 // abort process on blocking calls
     86                 FATAL_IF_NOT_ONEWAY,
     87             };
     88             // Sets calling restrictions for all transactions in this process. This must be called
     89             // before any threads are spawned.
     90             void setCallRestriction(CallRestriction restriction);
     91 
     92 private:
     93     friend class IPCThreadState;
     94 
     95             explicit            ProcessState(const char* driver);
     96                                 ~ProcessState();
     97 
     98                                 ProcessState(const ProcessState& o);
     99             ProcessState&       operator=(const ProcessState& o);
    100             String8             makeBinderThreadName();
    101 
    102             struct handle_entry {
    103                 IBinder* binder;
    104                 RefBase::weakref_type* refs;
    105             };
    106 
    107             handle_entry*       lookupHandleLocked(int32_t handle);
    108 
    109             String8             mDriverName;
    110             int                 mDriverFD;
    111             void*               mVMStart;
    112 
    113             // Protects thread count variable below.
    114             pthread_mutex_t     mThreadCountLock;
    115             pthread_cond_t      mThreadCountDecrement;
    116             // Number of binder threads current executing a command.
    117             size_t              mExecutingThreadsCount;
    118             // Maximum number for binder threads allowed for this process.
    119             size_t              mMaxThreads;
    120             // Time when thread pool was emptied
    121             int64_t             mStarvationStartTimeMs;
    122 
    123     mutable Mutex               mLock;  // protects everything below.
    124 
    125             Vector<handle_entry>mHandleToObject;
    126 
    127             bool                mManagesContexts;
    128             context_check_func  mBinderContextCheckFunc;
    129             void*               mBinderContextUserData;
    130 
    131             KeyedVector<String16, sp<IBinder> >
    132                                 mContexts;
    133 
    134 
    135             String8             mRootDir;
    136             bool                mThreadPoolStarted;
    137     volatile int32_t            mThreadPoolSeq;
    138 
    139             CallRestriction     mCallRestriction;
    140 };
    141 
    142 }; // namespace android
    143 
    144 // ---------------------------------------------------------------------------
    145 
    146 #endif // ANDROID_PROCESS_STATE_H
    147