From e033e0a5a8e55f304ae6749aea44d1163b4e612f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 27 May 2026 11:25:56 -0400 Subject: [PATCH] MT#59962 convert sess_stopped to atomic bool Change-Id: I45ef053519e8298233af58ed60ec7b4fb2fb40ed --- core/AmSession.cpp | 28 +++++++++++----------------- core/AmSession.h | 4 ++-- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/core/AmSession.cpp b/core/AmSession.cpp index 1b9bdee1..d2ec566f 100644 --- a/core/AmSession.cpp +++ b/core/AmSession.cpp @@ -424,7 +424,7 @@ bool AmSession::processingCycle() { ILOG_DLG(L_DBG, "vv S [%s|%s] %s, %s, %i UACTransPending, %i usages vv\n", dlg->getCallid().c_str(),getLocalTag().c_str(), dlg->getStatusStr(), - sess_stopped.get()?"stopped":"running", + sess_stopped?"stopped":"running", dlg->getUACTransPending(), dlg->getUsages()); @@ -438,7 +438,7 @@ bool AmSession::processingCycle() { } AmSipDialog::Status dlg_status = dlg->getStatus(); - bool s_stopped = sess_stopped.get(); + bool s_stopped = sess_stopped; ILOG_DLG(L_DBG, "^^ S [%s|%s] %s, %s, %i UACTransPending, %i usages ^^\n", dlg->getCallid().c_str(),getLocalTag().c_str(), @@ -490,7 +490,7 @@ bool AmSession::processingCycle() { ILOG_DLG(L_DBG, "^^ S [%s|%s] %s, %s, %i UACTransPending, %i usages ^^\n", dlg->getCallid().c_str(),getLocalTag().c_str(), dlg->getStatusStr(), - sess_stopped.get()?"stopped":"running", + sess_stopped?"stopped":"running", dlg->getUACTransPending(), dlg->getUsages()); @@ -531,20 +531,14 @@ void AmSession::finalize() } void AmSession::setStopped(bool wakeup) { - /* explicit lock management, for the case when onStop()'s override - * anyhow reaches the same mutex lock in similar scope. - */ - snapshot_lock.lock(); - - if (!sess_stopped.get()) { - sess_stopped.set(true); - snapshot_lock.unlock(); /* release now for dead-lock safety */ + bool f = false; + if (sess_stopped.compare_exchange_strong(f, true)) onStop(); - } - snapshot_lock.lock(); - if (wakeup) + + if (wakeup) { + lock_guard lock(snapshot_lock); AmSessionContainer::instance()->postEvent(getLocalTag(), new AmEvent(E_TERMINATE_LEG)); - snapshot_lock.unlock(); + } } string AmSession::getAppParam(const string& param_name) const @@ -856,11 +850,11 @@ void AmSession::onSipReply(const AmSipRequest& req, const AmSipReply& reply, ILOG_DLG(L_DBG, "Dialog status changed %s -> %s (stopped=%s) \n", AmBasicSipDialog::getStatusStr(old_dlg_status), dlg->getStatusStr(), - sess_stopped.get() ? "true" : "false"); + sess_stopped ? "true" : "false"); } else { ILOG_DLG(L_DBG, "Dialog status stays %s (stopped=%s)\n", AmBasicSipDialog::getStatusStr(old_dlg_status), - sess_stopped.get() ? "true" : "false"); + sess_stopped ? "true" : "false"); } } diff --git a/core/AmSession.h b/core/AmSession.h index f680ff10..c499529f 100644 --- a/core/AmSession.h +++ b/core/AmSession.h @@ -169,7 +169,7 @@ private: protected: - AmCondition sess_stopped; + atomic_bool sess_stopped; /** Logger **/ void setLogger(const shared_ptr& _logger, bool _log_sip, bool _log_rtp); @@ -442,7 +442,7 @@ public: /** * Has the session already been stopped ? */ - bool getStopped() { return sess_stopped.get(); } + bool getStopped() { return sess_stopped; } /* ---- Statistics ---- */ /**