You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							116 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							116 lines
						
					
					
						
							4.1 KiB
						
					
					
				/*
 | 
						|
 * Copyright (C) 2005 The Android Open Source Project
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef ANDROID_PROCESS_STATE_H
 | 
						|
#define ANDROID_PROCESS_STATE_H
 | 
						|
 | 
						|
#include <binder/IBinder.h>
 | 
						|
#include <utils/KeyedVector.h>
 | 
						|
#include <utils/String8.h>
 | 
						|
#include <utils/String16.h>
 | 
						|
 | 
						|
#include <utils/threads.h>
 | 
						|
 | 
						|
#include <pthread.h>
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------
 | 
						|
namespace android {
 | 
						|
 | 
						|
class IPCThreadState;
 | 
						|
 | 
						|
class ProcessState : public virtual RefBase
 | 
						|
{
 | 
						|
public:
 | 
						|
    static  sp<ProcessState>    self();
 | 
						|
 | 
						|
            void                setContextObject(const sp<IBinder>& object);
 | 
						|
            sp<IBinder>         getContextObject(const sp<IBinder>& caller);
 | 
						|
        
 | 
						|
            void                setContextObject(const sp<IBinder>& object,
 | 
						|
                                                 const String16& name);
 | 
						|
            sp<IBinder>         getContextObject(const String16& name,
 | 
						|
                                                 const sp<IBinder>& caller);
 | 
						|
 | 
						|
            void                startThreadPool();
 | 
						|
                        
 | 
						|
    typedef bool (*context_check_func)(const String16& name,
 | 
						|
                                       const sp<IBinder>& caller,
 | 
						|
                                       void* userData);
 | 
						|
        
 | 
						|
            bool                isContextManager(void) const;
 | 
						|
            bool                becomeContextManager(
 | 
						|
                                    context_check_func checkFunc,
 | 
						|
                                    void* userData);
 | 
						|
 | 
						|
            sp<IBinder>         getStrongProxyForHandle(int32_t handle);
 | 
						|
            wp<IBinder>         getWeakProxyForHandle(int32_t handle);
 | 
						|
            void                expungeHandle(int32_t handle, IBinder* binder);
 | 
						|
 | 
						|
            void                spawnPooledThread(bool isMain);
 | 
						|
            
 | 
						|
            status_t            setThreadPoolMaxThreadCount(size_t maxThreads);
 | 
						|
            void                giveThreadPoolName();
 | 
						|
 | 
						|
private:
 | 
						|
    friend class IPCThreadState;
 | 
						|
    
 | 
						|
                                ProcessState();
 | 
						|
                                ~ProcessState();
 | 
						|
 | 
						|
                                ProcessState(const ProcessState& o);
 | 
						|
            ProcessState&       operator=(const ProcessState& o);
 | 
						|
            String8             makeBinderThreadName();
 | 
						|
 | 
						|
            struct handle_entry {
 | 
						|
                IBinder* binder;
 | 
						|
                RefBase::weakref_type* refs;
 | 
						|
            };
 | 
						|
 | 
						|
            handle_entry*       lookupHandleLocked(int32_t handle);
 | 
						|
 | 
						|
            int                 mDriverFD;
 | 
						|
            void*               mVMStart;
 | 
						|
 | 
						|
            // Protects thread count variable below.
 | 
						|
            pthread_mutex_t     mThreadCountLock;
 | 
						|
            pthread_cond_t      mThreadCountDecrement;
 | 
						|
            // Number of binder threads current executing a command.
 | 
						|
            size_t              mExecutingThreadsCount;
 | 
						|
            // Maximum number for binder threads allowed for this process.
 | 
						|
            size_t              mMaxThreads;
 | 
						|
 | 
						|
    mutable Mutex               mLock;  // protects everything below.
 | 
						|
 | 
						|
            Vector<handle_entry>mHandleToObject;
 | 
						|
 | 
						|
            bool                mManagesContexts;
 | 
						|
            context_check_func  mBinderContextCheckFunc;
 | 
						|
            void*               mBinderContextUserData;
 | 
						|
 | 
						|
            KeyedVector<String16, sp<IBinder> >
 | 
						|
                                mContexts;
 | 
						|
 | 
						|
 | 
						|
            String8             mRootDir;
 | 
						|
            bool                mThreadPoolStarted;
 | 
						|
    volatile int32_t            mThreadPoolSeq;
 | 
						|
};
 | 
						|
    
 | 
						|
}; // namespace android
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------
 | 
						|
 | 
						|
#endif // ANDROID_PROCESS_STATE_H
 | 
						|
 |