IPCThreadState 详解

本文详细探讨了Android中的IPCThreadState,阐述了其初始化过程,包括如何在每个线程中获取IPCThreadState实例,以及构造函数中设置的数据结构如mIn和mOut的初始容量。通过对代码的分析,揭示了IPCThreadState在Android IPC机制中的关键作用。
摘要由CSDN通过智能技术生成

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 直接设了个容量,


接下来总结下各个功能


1. freeBuffer: 
          用于释放空间。  2个用处:
               1)             buffer.ipcSetDataReference 作为释放函数传入  
               2)             BR_REPLY: if no reply
          作为释放函数传入时,分别在传入和传出有体现BR_TRANSACTION and BR_REPLY 
    

           if (parcel != NULL) parcel->closeFileDescriptors();
          检查是否为空, noreply(2) 情况此值为空。 传入(1)此值为this, 当前parsel.   遍寻parsel结构体关闭所有 BINDER_TYPE_FD类型file .

          IPCThreadState* state = self(); 得到当前线程的IPCThreadState, 其实也就是当前结构体

          state->mOut.writeInt32(BC_FREE_BUFFER);
          state->mOut.writeInt32((int32_t)data);
          通过read write 写命令到驱动层,释放结构体。

2. threadDestructor
           用于毁掉这个线程,应该包括各种释放

          self->flushCommands();  ==〉 
           
          // 检查是否打开了底层驱动,如果没,直接返回
          if (mProcess->mDriverFD <= 0)
               return;
          // 与底层交流,试图关闭驱动
          talkWithDriver(false);  细节以后分析,不需要接受命令,但会把当前须传出的命令传下去

          #if defined(HAVE_ANDROID_OS)
               ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0);
          #endif
          直接操纵底层驱动,从驱动层删除了这个线程

3. executeCommand  执行各种命令  命令基本来自驱动层

              case BR_ERROR:
                  result = mIn.readInt32();
                  break;
               从下层读一个32bit, 好象是下面发了个错误信号,上层去读为什么出问题

               case BR_OK:
                  break;
               蛋疼。。

               case BR_ACQUIRE:
                   refs = (RefBase::weakref_type*)mIn.readInt32();
                   obj = (BBinder*)mIn.readInt32();
                   从底层拿这两个结构体上来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值