IPC是Android的精华,找了个时间,详细分析下IPCThreadState 的组织架构及其功能
初始化:用这个方法,我们可以在每个线程里取得IPCThreadState
IPCThreadState* IPCThreadState::self()
{
// 全局标志位,代表是否TSD已经建立
if (gHaveTLS) {
restart:
const pthread_key_t k = gTLS;
// 获取线程私有数据,即IPCThreadState本身,没有则创建。 保证每个线程都有相对应的IPCThreadState
IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
if (st) return st;
return new IPCThreadState;
}
if (gShutdown) return NULL;
pthread_mutex_lock(&gTLSMutex);
if (!gHaveTLS) {
// 如果线程私有数据没建立,则创建一个。
if (pthread_key_create(&gTLS, threadDestructor) != 0) {
pthread_mutex_unlock(&gTLSMutex);
return NULL;
}
gHaveTLS = true;
}
pthread_mutex_unlock(&gTLSMutex);
// 创建完,恢复到启始逻辑
goto restart;
}
看了它的构造函数,明显,这就是为每个线程邦定了个结构体。
然后,就是IPCThreadState的构造函数,非常简单简洁
IPCThreadState::IPCThreadState()
: mProcess(ProcessState::self()),
mMyThreadId(androidGetTid()),
mStrictModePolicy(0),
mLastTransactionBinderFlags(0)
{
pthread_setspecific(gTLS, this);
clearCaller();
mIn.setDataCapacity(256);
mOut.setDataCapacity(256);
}
可以看到,mIn和mOut 直接设了个容量,
接下来总结下各个功能
talkWithDriver(false); 细节以后分析,不需要接受命令,但会把当前须传出的命令传下去
#endif
break;