OpenHarmony升级5.0后,无法拨通电话问题分析
一、关键字: 通话,无法拨通电话。 二、问题描述 设备型号:黄鹂 系统版本:OpenHarmony 5.0 代码版本:OpenHarmony-5.0.0-Release 问题现象:设备插入SIM卡,拨打电话134xxxxxxxx,弹出通话的界面,但无法拨通对端电话。 三
一、关键字:
通话,主叫,无法拨通电话。
二、现象描述
设备型号:黄鹂
系统版本:OpenHarmony 5.0
代码版本:OpenHarmony-5.0.0-Release
问题现象:设备插入SIM卡,拨打电话134xxxxxxxx,弹出通话的拨号界面,但无法拨通对端电话。
三、原因分析
跟踪拨打电话代码流程
dial()
--->DialGsm()
--->EncapsulateDialCommon()
发现阻塞在如下位置
继续跟踪,阻塞在SetMute()
GetHandler()
在GetHandler()函数中,发现1282行申请锁的位置阻塞,程序在这里卡住。
分析这里程序卡住的原因,应该是发生死锁,导致程序在这里卡住。
发生死锁,肯定有其他地方持有这个锁没有释放。
查看所有handlerMapMutex_持有锁的代码,可以看见handlerMapMutex_持有锁一共有5处,加入打印分析哪里持有锁。
发现在RegisterCoreServiceHandler()函数中持有锁,没有释放。
加入打印,分析代码
第200行:锁住
第228行:在GetDomainPreferenceMode()函数中又申请了handlerMapMutex_,这里发生死锁。
第231行:解锁
GetDomainPreferenceMode()函数中,调用GetHandler()函数,会又申请了handlerMapMutex_锁
在GetHandler()函数中,申请handlerMapMutex_锁发生死锁
结论
在RegisterCoreServiceHandler()函数中发生死锁导致
RegisterCoreServiceHandler() ---申请handlerMapMutex_锁,锁住
--->GetDomainPreferenceMode()
--->GetDomainPreferenceModeRequest()
--->GetHandler() ---申请handlerMapMutex_锁,死锁
四、解决方案
在RegisterCoreServiceHandler()函数中,在GetDomainPreferenceMode()函数前解锁,这样就不会发生死锁的问题。
PR如下
https://gitee.com/openharmony/telephony_cellular_call/pulls/717
更多推荐
所有评论(0)