Merge "Fix timer and RtcpEncoder mutex nesting" into udc-qpr-dev am: 27467d304b
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/ImsMedia/+/25418378
Change-Id: I991d32917f5bc9d104faf9a5819eb2afd3316f15
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtcpEncoderNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtcpEncoderNode.cpp
index 35b4acb..cbdc703 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtcpEncoderNode.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtcpEncoderNode.cpp
@@ -92,13 +92,6 @@
void RtcpEncoderNode::Stop()
{
IMLOGD0("[Stop]");
- std::lock_guard<std::mutex> guard(mMutexTimer);
-
- if (mRtpSession != nullptr)
- {
- mRtpSession->StopRtcp();
- }
-
if (mTimer != nullptr)
{
ImsMediaTimer::TimerStop(mTimer, nullptr);
@@ -106,7 +99,17 @@
IMLOGD0("[Stop] Rtcp Timer stopped");
}
- mNodeState = kNodeStateStopped;
+ {
+ std::lock_guard<std::mutex> guard(mMutexTimer);
+ IMLOGD0("[Stop] mutex taken");
+
+ if (mRtpSession != nullptr)
+ {
+ mRtpSession->StopRtcp();
+ }
+
+ mNodeState = kNodeStateStopped;
+ }
}
bool RtcpEncoderNode::IsRunTime()
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaTimer.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaTimer.cpp
index 287a358..143e64f 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaTimer.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/utils/ImsMediaTimer.cpp
@@ -37,9 +37,9 @@
bool mTerminateThread;
uint32_t mStartTimeSec;
uint32_t mStartTimeMSec;
+ std::mutex mMutex;
};
-static std::mutex gMutex;
static std::mutex gMutexList;
static std::list<TimerInstance*> gTimerList;
@@ -135,21 +135,19 @@
pInstance->mStartTimeMSec = nCurrTimeMSec;
}
- gMutex.lock();
+ { // Critical section
+ std::lock_guard<std::mutex> guard(pInstance->mMutex);
+ if (pInstance->mTerminateThread)
+ {
+ break;
+ }
- if (pInstance->mTerminateThread)
- {
- gMutex.unlock();
- break;
+ if (pInstance->mTimerCb)
+ {
+ pInstance->mTimerCb(pInstance, pInstance->mUserData);
+ }
}
- if (pInstance->mTimerCb)
- {
- pInstance->mTimerCb(pInstance, pInstance->mUserData);
- }
-
- gMutex.unlock();
-
if (pInstance->mRepeat == false)
{
break;
@@ -162,7 +160,7 @@
if (pInstance != nullptr)
{
- free(pInstance);
+ delete pInstance;
pInstance = nullptr;
}
@@ -173,7 +171,7 @@
uint32_t nDuration, bool bRepeat, fn_TimerCb pTimerCb, void* pUserData)
{
struct timeval tp;
- TimerInstance* pInstance = reinterpret_cast<TimerInstance*>(malloc(sizeof(TimerInstance)));
+ TimerInstance* pInstance = new TimerInstance;
if (pInstance == nullptr)
{
@@ -186,7 +184,7 @@
pInstance->mUserData = pUserData;
pInstance->mTerminateThread = false;
- IMLOGD3("[TimerStart] Duratation[%u], bRepeat[%d], pUserData[%x]", pInstance->mDuration,
+ IMLOGD3("[TimerStart] Duration[%u], bRepeat[%d], pUserData[%x]", pInstance->mDuration,
bRepeat, pInstance->mUserData);
if (gettimeofday(&tp, nullptr) != -1)
@@ -196,7 +194,7 @@
}
else
{
- free(pInstance);
+ delete pInstance;
return nullptr;
}
@@ -211,6 +209,7 @@
{
TimerInstance* pInstance = reinterpret_cast<TimerInstance*>(hTimer);
+ IMLOGD1("[TimerStop] pInstance[%x]", pInstance);
if (pInstance == nullptr)
{
return false;
@@ -221,15 +220,18 @@
return false;
}
- gMutex.lock(); // just wait until timer callback returns...
- pInstance->mTerminateThread = true;
-
- if (ppUserData)
{
- *ppUserData = pInstance->mUserData;
+ std::lock_guard<std::mutex> guard(pInstance->mMutex);
+ IMLOGD1("[TimerStop] mutex taken pInstance[%x]", pInstance);
+
+ pInstance->mTerminateThread = true;
+
+ if (ppUserData)
+ {
+ *ppUserData = pInstance->mUserData;
+ }
}
- gMutex.unlock();
return true;
}