在Binder通信的服务器端,一般会存在这样一条语句:
IPCThreadState::self()->joinThreadPool();
从语句的字面意思都可以理解出,应该是跟线程有关的。与ProcessState::self()一样,IPCThreadState::self()函数也是类IPCThreadState的静态成员函数,属于这个类,不属于具体某个对象。
class IPCThreadState
{
public:
static IPCThreadState* self();
...
}
其函数体实现如下:
IPCThreadState* IPCThreadState::self()
{
// 判断gHaveTLS是true还是false,字面意思也可以知道是用来标记有无TLS(Thread Loacal Storage)的
if (gHaveTLS) {
restart:
const pthread_key_t k = gTLS;
//如果存在TLS,则根据key:gTLS去获取存储指向IPCThreadState对象的指针值,
//这是一个一对多的关系,所有线程使用相同的key,但是其每个线程存储的值(IPCThreadState对象)
//是线程私有的,每个线程都有一个这样的对象
IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
if (st) return st;
//如果此线程不存在这样的key:gTLS对应的值,则创建一个IPCThreadState新对象,
//并在其构造函数中添加进key:gTLS对应的线程局部空间中TLS(thread local storage)
return new IPCThreadState;
}
pthread_mutex_lock(&gTLSMutex);
if (!gHaveTLS) { //gHaveTLS为false表示进程中还没有TLS,则需要创建基于key:gTLS的线程局部存储
//创建基于key:gTLS的线程局部空间
int key_create_value = pthread_key_create(&gTLS, threadDestructor);
if (key_create_value != 0) {
pthread_mutex_unlock(&gTLSMutex);
return NULL;
}
gHaveTLS = true; //此时已经有TLS了,固gHaveTLS赋值为ture
}
pthread_mutex_unlock(&gTLSMutex);
goto restart;
}
以上分析多次提到线程局部空间(thread local storage),代表的是每个线程所私有的存储空间,线程中互不可以访问,是一个相对独立的空间,不懂的可以先行查资料去了解一下,这里不展开讲解。此线程局部空间就是去存储每一个线程都拥有的一个IPCThreadState对象,且都是独立的。
再看一下IPCThreadState的构造函数:
IPCThreadState::IPCThreadState()
: mProcess(ProcessState::self()),
mStrictModePolicy(0),
mLastTransactionBinderFlags(0)
{
pthread_setspecific(gTLS, this); //在此往key:gTLS添加IPCThreadState对象
clearCaller();
mIn.setDataCapacity(256); //初始化线程私有的数据输入空间大小
mOut.setDataCapacity(256); //初始化线程私有的数据输出空间大小
}
IPCThreadState::joinThreadPool()函数的目的是让线程进入到循环中,等待命令,解析命令,给出响应,函数体如下:
void IPCThreadState::joinThreadPool(bool isMain = true)
{
mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
status_t result;
do {
processPendingDerefs();
// now get the next command to be processed, waiting if necessary
result = getAndExecuteCommand(); //此函数为joinThreadPool()函数的主要任务过程
} while (result != -ECONNREFUSED && result != -EBADF);
mOut.writeInt32(BC_EXIT_LOOPER);
talkWithDriver(false);
}
从以上代码可以看出,IPCThreadState::joinThreadPool()函数主要是在一个do…while()循环里面不断的读取命令数据,然后解析命令数据,并给出相应的响应。
status_t IPCThreadState::getAndExecuteCommand()
{
status_t result;
int32_t cmd;
result = talkWithDriver(); //读取数据
if (result >= NO_ERROR) {
size_t IN = mIn.dataAvail();
if (IN < sizeof(int32_t)) return result;
cmd = mIn.readInt32();
IF_LOG_COMMANDS() {
alog << "Processing top-level Command: "
<< getReturnString(cmd) << endl;
}
pthread_mutex_lock(&mProcess->mThreadCountLock);
mProcess->mExecutingThreadsCount++;
if (mProc