hidl hwbinder和binder混合使用相关的joinThreadPool问题解答

背景:

今天一个学员在群里有个提问如下图,怎么有两个joinThread,会执行么?joinThread不是死循环等待数据吗?
/frameworks/av/media/mediaserver/main_mediaserver.cpp
在这里插入图片描述当开始看到这个时候确实也觉得最后的hw的join根本不会执行哈

为了验证我加入了如下日志:
看看主线程执行到哪了:
在这里插入图片描述看看joinThreadPool是否会退出:
在这里插入图片描述
结果执行如下:
明显log看到没有任何执行::android::hardware::joinRpcThreadpool()
在这里插入图片描述

为啥会有这个的joinRpcThreadpool

这里就得查一下相关的提交日志了
相关提交如下:

commit a4c39654219a7ed7ee6bb3ef5acbb1afd32a4a48
Author: Pawin Vongmasa <pawin@google.com>
Date:   Tue Jun 30 09:30:58 2020 -0700

    mediaserver: add more hwbinder threads
    
    Since we're now using HIDL IGraphicBufferSource in CCodec, the
    existence of a callstack with mixed binder and hwbinder calls can cause
    a stall when all threads are in use. (b/35283480) The recommended
    workaround was to increase the number of threads. This CL does that.
    
    Test: atest CtsMediaTestCases
    Test: atest CtsCameraTestCases
    
    Bug: 153828976
    Change-Id: I37f02b6237ad032e311a8219b209713d2e4463a6

 #include <binder/IPCThreadState.h>
 #include <binder/ProcessState.h>
 #include <binder/IServiceManager.h>
+#include <hidl/HidlTransportSupport.h>
 #include <utils/Log.h>
 #include "RegisterExtensions.h"
 
@@ -42,6 +43,8 @@ int main(int argc __unused, char **argv __unused)
     MediaPlayerService::instantiate();
     ResourceManagerService::instantiate();
     registerExtensions();
+    ::android::hardware::configureRpcThreadpool(16, false);
     ProcessState::self()->startThreadPool();
     IPCThreadState::self()->joinThreadPool();
+    ::android::hardware::joinRpcThreadpool();
 }

可以明显看出这个joinRpcThreadpool只是为了和前面的configureRpcThreadpool成对出现加入的,并没说添加这个joinRpcThreadpool是为了单独修复什么。明显这个地方的::android::hardware::joinRpcThreadpool()方法并没有见到他的执行,故这个地方的::android::hardware::joinRpcThreadpool()显得很多余

扩展hwbinder相关的joinRpcThreadpool如何进入

上面代码是显式调用进入hwbinder的循环接受消息,上面joinRpcThreadpool代码居然没有执行,那么疑问来了?请问又是在哪里进入的循环接受消息呢?
比如拿SurfaceFlinger来举例,SurfaceFlinger代码中也从来没见到有调用joinRpcThreadpool,但是他依然可以hidl通讯,抓取trace还发现有对于的hwbinder线程,比如硬件vsync的校准

在这里插入图片描述

这到底是为啥?都没有见到有Hwbinder的IPCThreadState.joinRpcThreadpool和ProcessState.startThreadPool的调用,哪来的hw线binder程。。。。死活找不到对于的代码调用端啊。
(IPCThreadState.joinRpcThreadpool和ProcessState.startThreadPool为啥启动线程,这个可以看马哥的跨进程专题课程)

哈哈,这里马哥本来想去Hwbinder的IPCThreadState或ProcessState中加个CallStack不就好了么。。。可以使理想很美好,实际发现libutilscallstack库加入不进去,会导致一堆bp编译错误。。。哎,懒着折腾这个编译相关错误,这个方便堆栈路封死了。。。那么就只能采用其他线索摸索啦,终于经过漫长摸索发现在hidl的自动生成代码中有相关的线索:
在这里插入图片描述
这里可以经过日志和额外加trace可以确定就是这个地方启动了hwbinder线程池:
在这里插入图片描述
上面是不是展示了在跨进程调用HIDL::IComposerClient::registerCallback::client方法时候进行的hwbinder线程池启动

总结

所以很多时候并不需要在自己的业务代码中显式调用的相关的joinRpcThreadpool和startThreadPool相关方法,因为在hidl相关生成的代码中会调用相关读取hwbinder线程池启动。所以大家在看代码时候发现自己业务代码中没有hwbinder相关的线程池启动,但实际有相关hwbinder线程则可以考虑去相关的hidl生成代码中查找

更多framework干货课程如下(需要的可以私聊马哥 获取优惠 +V :androidframework007):
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑篇——将串口映射到远程电脑上

通过Windows自带的远程桌面连接功能&#xff0c;可以通过修改本地资源选项&#xff0c;将本机的串口/端口映射到远程电脑上。 即可将端口映射到远程电脑上。 &#xff08;在远程的电脑的设备管理器中可能不会显示&#xff0c;但是用串口调试相关的工具&#xff0c;是可以找到相…

JVM——类加载器(JDK8及之前,双亲委派机制)

目录 1.类加载器的分类1.实现方式分类1.虚拟机底层实现2.JDK中默认提供或者自定义 2.类加载器的分类-启动类加载器3.类加载器的分类-Java中的默认类加载器4.类加载器的分类-扩展类加载器5.类加载器的分类-类加载器的继承 2.类加载器的双亲委派机制 类加载器&#xff08;ClassLo…

文件上传_白名单、内容校验、竞争上传

服务端校验—后缀名白名单校验 服务端校验—文件内容头校验 竞争上传

ROS 学习应用篇(五)服务Server学习之自定义服务与调用

在之前我学着如何建立一个话题Topic的消息类型&#xff0c;那时候建立了一个msg文件&#xff0c;包括&#xff0c;消息名称和消息数据类型&#xff08;int还是什么之类的。&#xff09;&#xff0c;将其链接到CMakeList&#xff0c;.xml文件补录需要的依赖&#xff0c;CMakeLis…

十九章总结

一.Java绘图类 1.Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 2.Graphics2D类 Graphics2…

Vue3问题:如何实现拼图验证+邮箱登录功能?前后端!

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约3500字&#xff0c;整篇阅读大约需要5分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

「软件设计」权威领域驱动设计(DDD)简介

「软件设计」权威领域驱动设计(DDD)简介 今天的企业应用程序无疑是复杂的&#xff0c;并依赖一些专门技术&#xff08;持久性&#xff0c;AJAX&#xff0c;Web服务等&#xff09;来完成它们的工作。作为开发人员&#xff0c;我们倾向于关注这些技术细节是可以理解的。但事实是…

一键将CSDN博客文章如何转为Markdown

文章目录 1.在CSDN博文页面点击右键&#xff0c;选择“检查”&#xff08;Google浏览器为例&#xff09;。2.在查看器中搜索article_content&#xff0c;找到对应内容&#xff0c;点击…复制为outerHTML。3.打开网址https://tool.lu/markdown/&#xff0c;点击HTML2MD&#xff…

准备搞OpenStack了,先装一台最新的Ubuntu 23.10

正文共&#xff1a;1113 字 25 图&#xff0c;预估阅读时间&#xff1a;2 分钟 依稀记得前面发了一篇Ubuntu的安装文档&#xff08;66%的经验丰富开发者和69%的学生更喜欢的Ubuntu的安装初体验&#xff09;&#xff0c;当时安装的是20.04.3的版本&#xff0c;现在看来已经是非常…

第一百七十三回 如何创建线性渐变背景

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SegmentedButton组件"相关的内容&#xff0c;本章回中将介绍" 如何创建线性渐变背景"。闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

医学图像 开源数据整理合集1

本文为医学图像 开源数据整理合集&#xff0c;为科研数据提供方便和检索。 目录 1 NIH database of 100000 Chest X-rays 2 The Cancer Imaging Archive (TCIA) 3 National Institute for Mental Healths (NIMHs) OpenNeuro.org 4 RSNAs Quantitative Imaging Data Wareh…

Git目录不对,即当前文件夹不对应git仓库

报错信息是&#xff1a; fatal: not a git repository (or any of the parent directories): .git 如&#xff1a; 是当前文件夹不对应git仓库&#xff0c;一般在git clone之后&#xff0c;需要进入下一级文件夹才对应仓库。 在文件夹看&#xff0c;本层中没有.git文件夹&…

动画短片怎么制作gif?一个方法简单又好用

网络上常常能看到动画短片&#xff0c;虽然时长短但是内容很丰富。当我们想要将这种动画短片做成gif格式图片的时候&#xff0c;应该怎么办呢&#xff1f;很简单&#xff0c;通过使用在线制作动画&#xff08;https://www.gif.cn/&#xff09;网站&#xff0c;无需下载软件上传…

Django模版层

解析: forloop内置对象:运行结果解析 counter0: 从0开始计数 counter : 从1开始计数 first: True,判断循环的开始 last : Tues,判断循环的结束模版变量的书写 我们可以在html中编写python代码。 演示&#xff1a; {{ 填写变量 }}{% 填写类的 %}{{ d.0 }} {{ d.1 }…

全年无休、随时更新, RPA在执行工作中的智能化创新

为深化政法智能化建设&#xff0c;加强“智慧治理”“智慧法院”“智慧检务”“智慧警务”“智慧司法”等信息平台建设&#xff0c;深入实施大数据战略&#xff0c;实现科技创新成果同政法工作深度融合。法制日报社于今年3月继续举办了2023政法智能化建设创新案例及论文征集宣传…

计算机视觉基础(8)——齐次坐标系与相机内外参

前言 本节我们将学习到透视投影、齐次坐标系等基础知识&#xff0c;在这些基础知识上&#xff0c;进一步了解到相机的参数&#xff0c;相机参数分为相机外参和相机内参&#xff0c;相机外参是从世界坐标系到相机坐标系&#xff0c;相机内参是从相机坐标系到图像坐标系。 一、透…

今年副业比主业赚得多...

我是从20年开始接触副业的&#xff0c;主要是在程序员外包平台上接单。从一开始的月入0到几百&#xff0c;到现在每个月稳定有小一万的收入。这个月接了一个比较大的项目&#xff0c;结款之后发现今年的副业已经比主业赚得多了&#xff0c;简直美滋滋~ 今年主业收入8w&#xff…

Qt QWebSocket实现JS调用C++

目录 前言1、QWebChannel如何与网页通信2、QWebSocketQWebChannel与网页通信2.1 WebSocketTransport2.2 WebSocketClientWrapper2.3 初始化WebSocket服务器2.4 前端网页代码修改 总结 前言 本篇主要介绍实现JS调用C的另一种方式&#xff0c;即QWebSocketQWebChannel。与之前的…

C#开发的OpenRA游戏之世界存在的属性RenderDebugState(5)

C#开发的OpenRA游戏之世界存在的属性RenderDebugState(5) 前面分析过一个调试的属性,在这里分析另外一个属性,这个属性就是RenderDebugState,它就是用来显示渲染的信息。 跟前面的分析规则可知,属性都是有一个信息类和操作类组成。 在这里信息类叫RenderDebugStateInfo…

Spring6(一):入门案例

文章目录 1. 概述1.1 Spring简介1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成 2 入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.2.2 创建java类2.2.3 创建配置文件2.2.4 创建测试类测试 2.3 程序分析2.4 启用Log4j2日志框架2.4.1 引入Log4j2依赖2.4.2 加…