Paul-Louis Ageneau пре 4 година
родитељ
комит
d766b67661
2 измењених фајлова са 14 додато и 10 уклоњено
  1. 4 2
      include/rtc/mediachainablehandler.hpp
  2. 10 8
      src/mediachainablehandler.cpp

+ 4 - 2
include/rtc/mediachainablehandler.hpp

@@ -29,13 +29,15 @@ namespace rtc {
 class RTC_CPP_EXPORT MediaChainableHandler : public MediaHandler {
 class RTC_CPP_EXPORT MediaChainableHandler : public MediaHandler {
 	const shared_ptr<MediaHandlerRootElement> root;
 	const shared_ptr<MediaHandlerRootElement> root;
 	shared_ptr<MediaHandlerElement> leaf;
 	shared_ptr<MediaHandlerElement> leaf;
-	std::mutex inoutMutex;
+	mutable std::mutex mutex;
 
 
 	message_ptr handleIncomingBinary(message_ptr);
 	message_ptr handleIncomingBinary(message_ptr);
 	message_ptr handleIncomingControl(message_ptr);
 	message_ptr handleIncomingControl(message_ptr);
 	message_ptr handleOutgoingBinary(message_ptr);
 	message_ptr handleOutgoingBinary(message_ptr);
 	message_ptr handleOutgoingControl(message_ptr);
 	message_ptr handleOutgoingControl(message_ptr);
 	bool sendProduct(ChainedOutgoingProduct product);
 	bool sendProduct(ChainedOutgoingProduct product);
+	shared_ptr<MediaHandlerElement> getLeaf() const;
+
 public:
 public:
 	MediaChainableHandler(shared_ptr<MediaHandlerRootElement> root);
 	MediaChainableHandler(shared_ptr<MediaHandlerRootElement> root);
 	~MediaChainableHandler();
 	~MediaChainableHandler();
@@ -46,7 +48,7 @@ public:
 
 
 	/// Adds element to chain
 	/// Adds element to chain
 	/// @param chainable Chainable element
 	/// @param chainable Chainable element
-    void addToChain(shared_ptr<MediaHandlerElement> chainable);
+	void addToChain(shared_ptr<MediaHandlerElement> chainable);
 };
 };
 
 
 } // namespace rtc
 } // namespace rtc

+ 10 - 8
src/mediachainablehandler.cpp

@@ -62,9 +62,8 @@ bool MediaChainableHandler::sendProduct(ChainedOutgoingProduct product) {
 message_ptr MediaChainableHandler::handleIncomingBinary(message_ptr msg) {
 message_ptr MediaChainableHandler::handleIncomingBinary(message_ptr msg) {
 	assert(msg->type == Message::Binary);
 	assert(msg->type == Message::Binary);
 	auto messages = root->split(msg);
 	auto messages = root->split(msg);
-	auto incoming = leaf->formIncomingBinaryMessage(messages, [this](ChainedOutgoingProduct outgoing) {
-		return sendProduct(outgoing);
-	});
+	auto incoming = getLeaf()->formIncomingBinaryMessage(
+	    messages, [this](ChainedOutgoingProduct outgoing) { return sendProduct(outgoing); });
 	if (incoming) {
 	if (incoming) {
 		return root->reduce(incoming);
 		return root->reduce(incoming);
 	} else {
 	} else {
@@ -74,9 +73,8 @@ message_ptr MediaChainableHandler::handleIncomingBinary(message_ptr msg) {
 
 
 message_ptr MediaChainableHandler::handleIncomingControl(message_ptr msg) {
 message_ptr MediaChainableHandler::handleIncomingControl(message_ptr msg) {
 	assert(msg->type == Message::Control);
 	assert(msg->type == Message::Control);
-	auto incoming = leaf->formIncomingControlMessage(msg, [this](ChainedOutgoingProduct outgoing) {
-		return sendProduct(outgoing);
-	});
+	auto incoming = getLeaf()->formIncomingControlMessage(
+	    msg, [this](ChainedOutgoingProduct outgoing) { return sendProduct(outgoing); });
 	assert(!incoming || incoming->type == Message::Control);
 	assert(!incoming || incoming->type == Message::Control);
 	return incoming;
 	return incoming;
 }
 }
@@ -129,7 +127,6 @@ message_ptr MediaChainableHandler::outgoing(message_ptr ptr) {
 		LOG_ERROR << "Outgoing message is nullptr, ignoring";
 		LOG_ERROR << "Outgoing message is nullptr, ignoring";
 		return nullptr;
 		return nullptr;
 	}
 	}
-	std::lock_guard<std::mutex> guard(inoutMutex);
 	if (ptr->type == Message::Binary) {
 	if (ptr->type == Message::Binary) {
 		return handleOutgoingBinary(ptr);
 		return handleOutgoingBinary(ptr);
 	} else if (ptr->type == Message::Control) {
 	} else if (ptr->type == Message::Control) {
@@ -143,7 +140,6 @@ message_ptr MediaChainableHandler::incoming(message_ptr ptr) {
 		LOG_ERROR << "Incoming message is nullptr, ignoring";
 		LOG_ERROR << "Incoming message is nullptr, ignoring";
 		return nullptr;
 		return nullptr;
 	}
 	}
-	std::lock_guard<std::mutex> guard(inoutMutex);
 	if (ptr->type == Message::Binary) {
 	if (ptr->type == Message::Binary) {
 		return handleIncomingBinary(ptr);
 		return handleIncomingBinary(ptr);
 	} else if (ptr->type == Message::Control) {
 	} else if (ptr->type == Message::Control) {
@@ -162,7 +158,13 @@ bool MediaChainableHandler::send(message_ptr msg) {
 	return false;
 	return false;
 }
 }
 
 
+shared_ptr<MediaHandlerElement> MediaChainableHandler::getLeaf() const {
+	std::lock_guard lock(mutex);
+	return leaf;
+}
+
 void MediaChainableHandler::addToChain(shared_ptr<MediaHandlerElement> chainable) {
 void MediaChainableHandler::addToChain(shared_ptr<MediaHandlerElement> chainable) {
+	std::lock_guard lock(mutex);
 	assert(leaf);
 	assert(leaf);
 	leaf = leaf->chainWith(chainable);
 	leaf = leaf->chainWith(chainable);
 }
 }