Binder进程与线程ProcessState以及IPCThreadState
发布时间:2020-12-14 04:44:50 所属栏目:大数据 来源:网络整理
导读:ProcessState以及IPCThreadState ProcessState是负责打开Binder节点并做mmap映射,IPCThreadState是负责与Binder驱动进行具体的命令交互。 ProcessState 实现ProcessState的主要关键点有以下几个: 保证同一进程只有一个ProcessState实例,且只有在ProcessSt
ProcessState以及IPCThreadStateProcessState是负责打开Binder节点并做mmap映射,IPCThreadState是负责与Binder驱动进行具体的命令交互。 ProcessState
sp<ProcessState> ProcessState::self() { if (gProcess != NULL) return gProcess; AutoMutex _l(gProcessMutex); if (gProcess == NULL) gProcess = new ProcessState; return gProcess; } 可以看到,在这里也是先检查是否存在一个已经实例化的prosessstate,否则创建一个,所以获取ProcessState对象,需要通过这个self方法。
ProcessState::ProcessState() : mDriverFD(open_driver()),mVMStart(MAP_FAILED),mManagesContexts(false),mBinderContextCheckFunc(NULL),mBinderContextUserData(NULL),mThreadPoolStarted(false),mThreadPoolSeq(1) { if (mDriverFD >= 0) { mVMStart = mmap(0,BINDER_VM_SIZE,PROT_READ,MAP_PRIVATE | MAP_NORESERVE,mDriverFD,0); if (mVMStart == MAP_FAILED) { // *sigh* LOGE("Using /dev/binder failed: unable to mmap transaction memory.n"); close(mDriverFD); mDriverFD = -1; } #else mDriverFD = -1; #endif } if (mDriverFD < 0) { // Need to run without the driver,starting our own thread pool. } } 可以看到有两个之前学习的时候了解到了,与Binder驱动紧密相关的方法:
IPCThreadState代码位置:/frameworks/native/libs/binder/IPCThreadState.cpp
IPCThreadState* IPCThreadState::self() { if (gHaveTLS) { //当执行完第一次之后,再次运行的时候就已经有IPCThreadState实例,只需要获取就可以使用 restart: const pthread_key_t k = gTLS; IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); if (st) return st; return new IPCThreadState; } if (gShutdown) { ALOGW("Calling IPCThreadState::self() during shutdown is dangerous,expect a crash.n"); return NULL; } pthread_mutex_lock(&gTLSMutex); if (!gHaveTLS) { //初始的gHaveTLS的值false,所以第一次调用的时候,会执行这里的代码 //随后将gHaveTLS设置为true int key_create_value = pthread_key_create(&gTLS,threadDestructor); if (key_create_value != 0) { pthread_mutex_unlock(&gTLSMutex); ALOGW("IPCThreadState::self() unable to create TLS key,expect a crash: %sn",strerror(key_create_value)); return NULL; } gHaveTLS = true; } pthread_mutex_unlock(&gTLSMutex); goto restart; } 通过上面的方法,就能保证“线程单实例”的目的
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |