Binder进程与线程ProcessState以及IPCThreadState
2020-12-05 14:02
阅读:513
可以看到有两个之前学习的时候了解到了,与Binder驱动紧密相关的方法:
一个是open_driver(),另一个是下面的mmap(),也就是最终打开了Binder结点以及进行了内存块的映射。
- 接下来分析在之前用到的获取IBinder的对象时的一个方法:getContextObject
在这个方法中,传入了一个handel,最终得到了一个BpBinder,而这个BpBinder是Binder在Native层的代理。
spProcessState::getContextObject(const sp & /*caller*/) { return getStrongProxyForHandle(0); }
ProcessState::getStrongProxyForHandle
spProcessState::getStrongProxyForHandle(int32_t handle) { sp result; AutoMutex _l(mLock); handle_entry* e = lookupHandleLocked(handle); if (e != NULL) { ...... IBinder* b = e->binder; if (b == NULL || !e->refs->attemptIncWeak(this)) { if (handle == 0) { ...... Parcel data; status_t status = IPCThreadState::self()->transact( 0, IBinder::PING_TRANSACTION, data, NULL, 0); if (status == DEAD_OBJECT) return NULL; } b = new BpBinder(handle); e->binder = b; if (b) e->refs = b->getWeakRefs(); result = b; } else { // This little bit of nastyness is to allow us to add a primary // reference to the remote proxy when this team doesn‘t have one // but another team is sending the handle to us. result.force_set(b); e->refs->decWeak(this); } } return result; }
ProcessState::lookupHandleLocked
ProcessState::handle_entry* ProcessState::lookupHandleLocked(int32_t handle) { const size_t N=mHandleToObject.size(); if (N (size_t)handle) { handle_entry e; e.binder = NULL; e.refs = NULL; status_t err = mHandleToObject.insertAt(e, N, handle+1-N); if (err return NULL; } return &mHandleToObject.editItemAt(handle); }
从这儿看,先调用lookupHandleLocked方法,由于是第一次调用,因此新建一个handle_entry,并返回,而且其binder和refs为NULL
那么getStrongProxyForHandle方法接着往下走,由于binder为NULL,mHandle传入的是0,因此进入判断条件中,最后new BpBinder,且参数为0
因此,返回的是new BpBinder(0)
spb = ProcessState::self()->getContextObject(NULL);
IPCThreadState
代码位置:/frameworks/native/libs/binder/IPCThreadState.cpp
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:Binder进程与线程ProcessState以及IPCThreadState
文章链接:http://soscw.com/essay/23347.html
文章标题:Binder进程与线程ProcessState以及IPCThreadState
文章链接:http://soscw.com/essay/23347.html
评论
亲,登录后才可以留言!