Răsfoiți Sursa

Enhanced emplaceTransport() methods

Paul-Louis Ageneau 3 ani în urmă
părinte
comite
0bff6b8460
2 a modificat fișierele cu 19 adăugiri și 3 ștergeri
  1. 10 2
      src/impl/peerconnection.cpp
  2. 9 1
      src/impl/websocket.cpp

+ 10 - 2
src/impl/peerconnection.cpp

@@ -119,13 +119,21 @@ size_t PeerConnection::remoteMaxMessageSize() const {
 // Helper for PeerConnection::initXTransport methods: start and emplace the transport
 // Helper for PeerConnection::initXTransport methods: start and emplace the transport
 template <typename T>
 template <typename T>
 shared_ptr<T> emplaceTransport(PeerConnection *pc, shared_ptr<T> *member, shared_ptr<T> transport) {
 shared_ptr<T> emplaceTransport(PeerConnection *pc, shared_ptr<T> *member, shared_ptr<T> transport) {
-	transport->start();
 	std::atomic_store(member, transport);
 	std::atomic_store(member, transport);
+	try {
+		transport->start();
+	} catch (...) {
+		std::atomic_store(member, decltype(transport)(nullptr));
+		transport->stop();
+		throw;
+	}
+
 	if (pc->state.load() == PeerConnection::State::Closed) {
 	if (pc->state.load() == PeerConnection::State::Closed) {
 		std::atomic_store(member, decltype(transport)(nullptr));
 		std::atomic_store(member, decltype(transport)(nullptr));
 		transport->stop();
 		transport->stop();
 		return nullptr;
 		return nullptr;
 	}
 	}
+
 	return transport;
 	return transport;
 }
 }
 
 
@@ -609,7 +617,7 @@ shared_ptr<DataChannel> PeerConnection::emplaceDataChannel(string label, DataCha
 			stream += 2;
 			stream += 2;
 		}
 		}
 	}
 	}
-	// If the DataChannel is user-negotiated, do not negociate it here
+	// If the DataChannel is user-negotiated, do not negotiate it here
 	auto channel =
 	auto channel =
 	    init.negotiated
 	    init.negotiated
 	        ? std::make_shared<DataChannel>(weak_from_this(), stream, std::move(label),
 	        ? std::make_shared<DataChannel>(weak_from_this(), stream, std::move(label),

+ 9 - 1
src/impl/websocket.cpp

@@ -179,13 +179,21 @@ void WebSocket::incoming(message_ptr message) {
 // Helper for WebSocket::initXTransport methods: start and emplace the transport
 // Helper for WebSocket::initXTransport methods: start and emplace the transport
 template <typename T>
 template <typename T>
 shared_ptr<T> emplaceTransport(WebSocket *ws, shared_ptr<T> *member, shared_ptr<T> transport) {
 shared_ptr<T> emplaceTransport(WebSocket *ws, shared_ptr<T> *member, shared_ptr<T> transport) {
-	transport->start();
 	std::atomic_store(member, transport);
 	std::atomic_store(member, transport);
+	try {
+		transport->start();
+	} catch (...) {
+		std::atomic_store(member, decltype(transport)(nullptr));
+		transport->stop();
+		throw;
+	}
+
 	if (ws->state == WebSocket::State::Closed) {
 	if (ws->state == WebSocket::State::Closed) {
 		std::atomic_store(member, decltype(transport)(nullptr));
 		std::atomic_store(member, decltype(transport)(nullptr));
 		transport->stop();
 		transport->stop();
 		return nullptr;
 		return nullptr;
 	}
 	}
+
 	return transport;
 	return transport;
 }
 }