diff --git a/talk/session/media/srtpfilter.cc b/talk/session/media/srtpfilter.cc index b47844f2e..5fc694623 100644 --- a/talk/session/media/srtpfilter.cc +++ b/talk/session/media/srtpfilter.cc @@ -474,6 +474,7 @@ bool SrtpFilter::ParseKeyParams(const std::string& key_params, #ifdef HAVE_SRTP bool SrtpSession::inited_ = false; +rtc::GlobalLockPod SrtpSession::lock_; SrtpSession::SrtpSession() : session_(NULL), @@ -691,6 +692,7 @@ bool SrtpSession::SetKey(int type, const std::string& cs, int err = srtp_create(&session_, &policy); if (err != err_status_ok) { + session_ = NULL; LOG(LS_ERROR) << "Failed to create SRTP session, err=" << err; return false; } @@ -702,6 +704,8 @@ bool SrtpSession::SetKey(int type, const std::string& cs, } bool SrtpSession::Init() { + rtc::GlobalLockScope ls(&lock_); + if (!inited_) { int err; err = srtp_init(); @@ -729,6 +733,8 @@ bool SrtpSession::Init() { } void SrtpSession::Terminate() { + rtc::GlobalLockScope ls(&lock_); + if (inited_) { int err = srtp_shutdown(); if (err) { diff --git a/talk/session/media/srtpfilter.h b/talk/session/media/srtpfilter.h index 43cb241b7..f171f5fe6 100644 --- a/talk/session/media/srtpfilter.h +++ b/talk/session/media/srtpfilter.h @@ -36,6 +36,7 @@ #include "talk/media/base/cryptoparams.h" #include "webrtc/p2p/base/sessiondescription.h" #include "webrtc/base/basictypes.h" +#include "webrtc/base/criticalsection.h" #include "webrtc/base/scoped_ptr.h" #include "webrtc/base/sigslotrepeater.h" @@ -242,6 +243,7 @@ class SrtpSession { int rtcp_auth_tag_len_; rtc::scoped_ptr srtp_stat_; static bool inited_; + static rtc::GlobalLockPod lock_; int last_send_seq_num_; DISALLOW_COPY_AND_ASSIGN(SrtpSession); }; diff --git a/webrtc/base/criticalsection.cc b/webrtc/base/criticalsection.cc index f4822d96f..4f3a28f2f 100644 --- a/webrtc/base/criticalsection.cc +++ b/webrtc/base/criticalsection.cc @@ -152,4 +152,13 @@ GlobalLock::GlobalLock() { lock_acquired = 0; } +GlobalLockScope::GlobalLockScope(GlobalLockPod* lock) + : lock_(lock) { + lock_->Lock(); +} + +GlobalLockScope::~GlobalLockScope() { + lock_->Unlock(); +} + } // namespace rtc diff --git a/webrtc/base/criticalsection.h b/webrtc/base/criticalsection.h index bd45d85bc..46a4f3408 100644 --- a/webrtc/base/criticalsection.h +++ b/webrtc/base/criticalsection.h @@ -114,6 +114,16 @@ class GlobalLock : public GlobalLockPod { GlobalLock(); }; +// GlobalLockScope, for serializing execution through a scope. +class SCOPED_LOCKABLE GlobalLockScope { + public: + explicit GlobalLockScope(GlobalLockPod* lock) EXCLUSIVE_LOCK_FUNCTION(lock); + ~GlobalLockScope() UNLOCK_FUNCTION(); + private: + GlobalLockPod* const lock_; + DISALLOW_COPY_AND_ASSIGN(GlobalLockScope); +}; + } // namespace rtc #endif // WEBRTC_BASE_CRITICALSECTION_H_