Browse Source

Merge branch 'v0.16'

Paul-Louis Ageneau 3 years ago
parent
commit
4b0a75a17d
5 changed files with 49 additions and 33 deletions
  1. 3 3
      src/global.cpp
  2. 24 24
      src/impl/init.cpp
  3. 3 3
      src/impl/init.hpp
  4. 10 2
      src/impl/peerconnection.cpp
  5. 9 1
      src/impl/websocket.cpp

+ 3 - 3
src/global.cpp

@@ -102,10 +102,10 @@ void InitLogger(plog::Severity severity, plog::IAppender *appender) {
 	plogInit(severity, appender);
 	plogInit(severity, appender);
 }
 }
 
 
-void Preload() { Init::Instance().preload(); }
-std::shared_future<void> Cleanup() { return Init::Instance().cleanup(); }
+void Preload() { impl::Init::Instance().preload(); }
+std::shared_future<void> Cleanup() { return impl::Init::Instance().cleanup(); }
 
 
-void SetSctpSettings(SctpSettings s) { Init::Instance().setSctpSettings(std::move(s)); }
+void SetSctpSettings(SctpSettings s) { impl::Init::Instance().setSctpSettings(std::move(s)); }
 
 
 } // namespace rtc
 } // namespace rtc
 
 

+ 24 - 24
src/impl/init.cpp

@@ -19,30 +19,30 @@
 #include "init.hpp"
 #include "init.hpp"
 #include "internals.hpp"
 #include "internals.hpp"
 
 
-#include "impl/certificate.hpp"
-#include "impl/dtlstransport.hpp"
-#include "impl/sctptransport.hpp"
-#include "impl/threadpool.hpp"
-#include "impl/tls.hpp"
+#include "certificate.hpp"
+#include "dtlstransport.hpp"
+#include "sctptransport.hpp"
+#include "threadpool.hpp"
+#include "tls.hpp"
 
 
 #if RTC_ENABLE_WEBSOCKET
 #if RTC_ENABLE_WEBSOCKET
-#include "impl/tlstransport.hpp"
+#include "tlstransport.hpp"
 #endif
 #endif
 
 
 #if RTC_ENABLE_MEDIA
 #if RTC_ENABLE_MEDIA
-#include "impl/dtlssrtptransport.hpp"
+#include "dtlssrtptransport.hpp"
 #endif
 #endif
 
 
 #ifdef _WIN32
 #ifdef _WIN32
 #include <winsock2.h>
 #include <winsock2.h>
 #endif
 #endif
 
 
-namespace rtc {
+namespace rtc::impl {
 
 
 struct Init::TokenPayload {
 struct Init::TokenPayload {
 	TokenPayload(std::shared_future<void> *cleanupFuture) {
 	TokenPayload(std::shared_future<void> *cleanupFuture) {
 		Init::Instance().doInit();
 		Init::Instance().doInit();
-		if(cleanupFuture)
+		if (cleanupFuture)
 			*cleanupFuture = cleanupPromise.get_future().share();
 			*cleanupFuture = cleanupPromise.get_future().share();
 	}
 	}
 
 
@@ -71,8 +71,8 @@ Init &Init::Instance() {
 
 
 Init::Init() {
 Init::Init() {
 	std::promise<void> p;
 	std::promise<void> p;
-    p.set_value();
-    mCleanupFuture = p.get_future(); // make it ready
+	p.set_value();
+	mCleanupFuture = p.get_future(); // make it ready
 }
 }
 
 
 Init::~Init() {}
 Init::~Init() {}
@@ -104,7 +104,7 @@ std::shared_future<void> Init::cleanup() {
 void Init::setSctpSettings(SctpSettings s) {
 void Init::setSctpSettings(SctpSettings s) {
 	std::lock_guard lock(mMutex);
 	std::lock_guard lock(mMutex);
 	if (mGlobal)
 	if (mGlobal)
-		impl::SctpTransport::SetSettings(s);
+		SctpTransport::SetSettings(s);
 
 
 	mCurrentSctpSettings = std::move(s); // store for next init
 	mCurrentSctpSettings = std::move(s); // store for next init
 }
 }
@@ -123,7 +123,7 @@ void Init::doInit() {
 		throw std::runtime_error("WSAStartup failed, error=" + std::to_string(WSAGetLastError()));
 		throw std::runtime_error("WSAStartup failed, error=" + std::to_string(WSAGetLastError()));
 #endif
 #endif
 
 
-	impl::ThreadPool::Instance().spawn(THREADPOOL_SIZE);
+	ThreadPool::Instance().spawn(THREADPOOL_SIZE);
 
 
 #if USE_GNUTLS
 #if USE_GNUTLS
 	// Nothing to do
 	// Nothing to do
@@ -131,14 +131,14 @@ void Init::doInit() {
 	openssl::init();
 	openssl::init();
 #endif
 #endif
 
 
-	impl::SctpTransport::Init();
-	impl::SctpTransport::SetSettings(mCurrentSctpSettings);
-	impl::DtlsTransport::Init();
+	SctpTransport::Init();
+	SctpTransport::SetSettings(mCurrentSctpSettings);
+	DtlsTransport::Init();
 #if RTC_ENABLE_WEBSOCKET
 #if RTC_ENABLE_WEBSOCKET
-	impl::TlsTransport::Init();
+	TlsTransport::Init();
 #endif
 #endif
 #if RTC_ENABLE_MEDIA
 #if RTC_ENABLE_MEDIA
-	impl::DtlsSrtpTransport::Init();
+	DtlsSrtpTransport::Init();
 #endif
 #endif
 }
 }
 
 
@@ -152,15 +152,15 @@ void Init::doCleanup() {
 
 
 	PLOG_DEBUG << "Global cleanup";
 	PLOG_DEBUG << "Global cleanup";
 
 
-	impl::ThreadPool::Instance().join();
+	ThreadPool::Instance().join();
 
 
-	impl::SctpTransport::Cleanup();
-	impl::DtlsTransport::Cleanup();
+	SctpTransport::Cleanup();
+	DtlsTransport::Cleanup();
 #if RTC_ENABLE_WEBSOCKET
 #if RTC_ENABLE_WEBSOCKET
-	impl::TlsTransport::Cleanup();
+	TlsTransport::Cleanup();
 #endif
 #endif
 #if RTC_ENABLE_MEDIA
 #if RTC_ENABLE_MEDIA
-	impl::DtlsSrtpTransport::Cleanup();
+	DtlsSrtpTransport::Cleanup();
 #endif
 #endif
 
 
 #ifdef _WIN32
 #ifdef _WIN32
@@ -168,4 +168,4 @@ void Init::doCleanup() {
 #endif
 #endif
 }
 }
 
 
-} // namespace rtc
+} // namespace rtc::impl

+ 3 - 3
src/impl/init.hpp

@@ -23,10 +23,10 @@
 #include "global.hpp" // for SctpSettings
 #include "global.hpp" // for SctpSettings
 
 
 #include <chrono>
 #include <chrono>
-#include <mutex>
 #include <future>
 #include <future>
+#include <mutex>
 
 
-namespace rtc {
+namespace rtc::impl {
 
 
 using init_token = shared_ptr<void>;
 using init_token = shared_ptr<void>;
 
 
@@ -61,6 +61,6 @@ private:
 	struct TokenPayload;
 	struct TokenPayload;
 };
 };
 
 
-} // namespace rtc
+} // namespace rtc::impl
 
 
 #endif
 #endif

+ 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;
 }
 }