一、关键字:

通话,主叫,无法拨通电话。

二、问题描述

设备型号:黄鹂

系统版本: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

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐