Browse Source

Added a mutex for the RTCP Handler

Staz M 4 years ago
parent
commit
c4c150a60b
2 changed files with 15 additions and 5 deletions
  1. 3 0
      include/rtc/track.hpp
  2. 12 5
      src/track.cpp

+ 3 - 0
include/rtc/track.hpp

@@ -28,6 +28,7 @@
 
 #include <atomic>
 #include <variant>
+#include <shared_mutex>
 
 namespace rtc {
 
@@ -77,6 +78,8 @@ private:
 	std::atomic<bool> mIsClosed = false;
 
 	Queue<message_ptr> mRecvQueue;
+
+	std::shared_mutex mRtcpHandlerMutex;
 	std::shared_ptr<RtcpHandler> mRtcpHandler;
 
 	friend class PeerConnection;

+ 12 - 5
src/track.cpp

@@ -62,7 +62,8 @@ bool Track::send(message_variant data) {
 
 	auto message = make_message(std::move(data));
 
-	if (mRtcpHandler) {
+    std::shared_lock lock(mRtcpHandlerMutex);
+    if (mRtcpHandler) {
 		message = mRtcpHandler->outgoing(message);
 		if (!message)
 			return false;
@@ -122,7 +123,8 @@ void Track::incoming(message_ptr message) {
 		return;
 	}
 
-	if (mRtcpHandler) {
+    std::shared_lock lock(mRtcpHandlerMutex);
+    if (mRtcpHandler) {
 		message = mRtcpHandler->incoming(message);
 		if (!message)
 			return;
@@ -159,17 +161,22 @@ bool Track::outgoing([[maybe_unused]] message_ptr message) {
 }
 
 void Track::setRtcpHandler(std::shared_ptr<RtcpHandler> handler) {
-	mRtcpHandler = std::move(handler);
+    std::unique_lock lock(mRtcpHandlerMutex);
+    mRtcpHandler = std::move(handler);
 	if (mRtcpHandler)
 		mRtcpHandler->onOutgoing(std::bind(&Track::outgoing, this, std::placeholders::_1));
 }
 
 bool Track::requestKeyframe() {
-	if (mRtcpHandler)
+    std::shared_lock lock(mRtcpHandlerMutex);
+    if (mRtcpHandler)
 		return mRtcpHandler->requestKeyframe();
 	return false;
 }
 
-std::shared_ptr<RtcpHandler> Track::getRtcpHandler() { return mRtcpHandler; }
+std::shared_ptr<RtcpHandler> Track::getRtcpHandler() {
+    std::shared_lock lock(mRtcpHandlerMutex);
+    return mRtcpHandler;
+}
 
 } // namespace rtc