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;
};