第一范文网 - 专业文章范例文档资料分享平台

android - IPC及原理简介

来源:用户分享 时间:2025/5/23 18:58:46 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

TextOutput::Bundle _b(alog);

alog << \ << handle << \

if (reply) alog << indent << *reply << dedent << endl; else alog << \ } } else {

err = waitForResponse(NULL, NULL); }

return err; }

status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) {

int32_t cmd; int32_t err;

while (1) {

if ((err=talkWithDriver()) < NO_ERROR) break; err = mIn.errorCheck(); if (err < NO_ERROR) break; if (mIn.dataAvail() == 0) continue;

cmd = mIn.readInt32();

IF_LOG_COMMANDS() {

alog << \ << getReturnString(cmd) << endl; }

switch (cmd) {

case BR_TRANSACTION_COMPLETE: if (!reply && !acquireResult) goto finish; break;

case BR_DEAD_REPLY: err = DEAD_OBJECT; goto finish;

case BR_FAILED_REPLY: err = FAILED_TRANSACTION; goto finish;

case BR_ACQUIRE_RESULT: {

LOG_ASSERT(acquireResult != NULL, \ const int32_t result = mIn.readInt32(); if (!acquireResult) continue;

*acquireResult = result ? NO_ERROR : INVALID_OPERATION; }

goto finish;

case BR_REPLY:

{

binder_transaction_data tr; err = mIn.read(&tr, sizeof(tr));

LOG_ASSERT(err == NO_ERROR, \brREPLY\

if (err != NO_ERROR) goto finish;

if (reply) {

if ((tr.flags & TF_STATUS_CODE) == 0) { reply->ipcSetDataReference( reinterpret_cast(tr.data.ptr.buffer), tr.data_size,

reinterpret_cast(tr.data.ptr.offsets), tr.offsets_size/sizeof(size_t), freeBuffer, this); } else {

err = *static_cast(tr.data.ptr.buffer); freeBuffer(NULL,

reinterpret_cast(tr.data.ptr.buffer), tr.data_size,

reinterpret_cast(tr.data.ptr.offsets), tr.offsets_size/sizeof(size_t), this); } } else {

freeBuffer(NULL,

reinterpret_cast(tr.data.ptr.buffer), tr.data_size,

reinterpret_cast(tr.data.ptr.offsets), tr.offsets_size/sizeof(size_t), this); continue; } }

goto finish;

default:

err = executeCommand(cmd); if (err != NO_ERROR) goto finish; break; } } finish:

if (err != NO_ERROR) {

if (acquireResult) *acquireResult = err; if (reply) reply->setError(err); mLastError = err; }

return err; }

这里transact把请求经内核模块发送了给服务端,服务端处理完请求之后,沿原路返回结果给调用者。这里也可以看出请求是同步操作,它会等待直到结果返回为止。

在BpBinder之上进行简单包装,我们可以得到与服务对象相同的接口,调用者无需要关心调用的对象是远程的还是本地的。拿ServiceManager来说: (frameworks/base/libs/utils/IServiceManager.cpp)

搜索更多关于: android - IPC及原理简介 的文档
android - IPC及原理简介.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c1uwhi1x56001k8300sr4_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top