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)