Binder之ProcessState和IPCThreadState類分析

ProcessState

  ProcessState表示進程狀態,一個進程就一個ProcessState對象。它的職責:1、打開Binder驅動;2、建立線程池。

 /frameworks/native/include/binder/ProcessState.h
 class ProcessState : public virtual RefBase
 {
	public:
		static  sp<ProcessState>    self();
		void  startThreadPool();
		void  spawnPooledThread(bool isMain);
	private:
		int  mDriverFD;
		void*  mVMStart;
		// Maximum number for binder threads allowed for this process.
		size_t  mMaxThreads;
		bool  mThreadPoolStarted;
		volatile  int32_t  mThreadPoolSeq;
 }

  以上是ProcessState中Binder相關的接口和成員變量。

1)獲取ProcessState實例,並打開Binder驅動

//單例模式
sp<ProcessState> ProcessState::self()
{
    Mutex::Autolock _l(gProcessMutex);
    if (gProcess != NULL) {
        return gProcess;
    }
    gProcess = new ProcessState;
    return gProcess;
}

//構造函數
ProcessState::ProcessState()
    : mDriverFD(open_driver())//在創建實例時就打開了Binder驅動
    , mVMStart(MAP_FAILED)
   ……
    , mMaxThreads(DEFAULT_MAX_BINDER_THREADS)
   ……
    , mThreadPoolStarted(false)
    , mThreadPoolSeq(1)
{
    if (mDriverFD >= 0) {
        // mmap the binder, providing a chunk of virtual address space to receive transactions.
        mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
        if (mVMStart == MAP_FAILED) {
            // *sigh*
            ALOGE("Using /dev/binder failed: unable to mmap transaction memory.\n");
            close(mDriverFD);
            mDriverFD = -1;
        }
    }

    LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened.  Terminating.");
}

  這個構造函數裏面調用open_driver()打開了/dev/binder設備驅動文件,返回了Binder驅動的文件描述符。在Linux裏一切皆文件,而文件描述符就相當於這個文件的句柄,可以對這個文件進行讀寫操作。有了Binder驅動的文件描述符就可以對Binder驅動進行讀寫。

2)創建線程池ProcessState::self()->startThreadPool();

void ProcessState::startThreadPool()
{
    AutoMutex _l(mLock);
    if (!mThreadPoolStarted) {//從這裏可以看出線程池只能被創建一次
        mThreadPoolStarted = true;
        spawnPooledThread(true);//創建線程池時就會馬上創建一個主線程
    }
}

void ProcessState::spawnPooledThread(bool isMain)
{
    if (mThreadPoolStarted) {
        String8 name = makeBinderThreadName();
        ALOGV("Spawning new pooled thread, name=%s\n", name.string());
        sp<Thread> t = new PoolThread(isMain);
        t->run(name.string());
    }
}
//PoolThread是一個繼承於Thread的類,創建了PoolThread其實就是創建了一個線程。
//調用t->run()之後相當於調用PoolThread類的threadLoop()函數。
class PoolThread : public Thread
{
public:
    PoolThread(bool isMain)
        : mIsMain(isMain)
    {
    }

protected:
    virtual bool threadLoop()
    {
        IPCThreadState::self()->joinThreadPool(mIsMain);
        // 這裏線程函數調用了一次IPCThreadState::self()->joinThreadPool()後就退出了
        return false;
    }

    const bool mIsMain;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章