Browse Source

Merge branch 'v0.17'

Paul-Louis Ageneau 3 years ago
parent
commit
f7467a1f62
2 changed files with 32 additions and 26 deletions
  1. 1 1
      CMakeLists.txt
  2. 31 25
      src/impl/sctptransport.cpp

+ 1 - 1
CMakeLists.txt

@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 3.7)
 project(libdatachannel
-	VERSION 0.17.5
+	VERSION 0.17.6
 	LANGUAGES CXX)
 set(PROJECT_DESCRIPTION "C/C++ WebRTC network library featuring Data Channels, Media Transport, and WebSockets")
 

+ 31 - 25
src/impl/sctptransport.cpp

@@ -187,9 +187,6 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
 
 	PLOG_DEBUG << "Initializing SCTP transport";
 
-	usrsctp_register_address(this);
-	Instances->insert(this);
-
 	mSock = usrsctp_socket(AF_CONN, SOCK_STREAM, IPPROTO_SCTP, nullptr, nullptr, 0, nullptr);
 	if (!mSock)
 		throw std::runtime_error("Could not create SCTP socket, errno=" + std::to_string(errno));
@@ -323,14 +320,14 @@ SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &c
 	if (usrsctp_setsockopt(mSock, SOL_SOCKET, SO_SNDBUF, &sndBuf, sizeof(sndBuf)))
 		throw std::runtime_error("Could not set SCTP send buffer size, errno=" +
 		                         std::to_string(errno));
+
+	usrsctp_register_address(this);
+	Instances->insert(this);
 }
 
 SctpTransport::~SctpTransport() {
 	stop();
 	close();
-
-	usrsctp_deregister_address(this);
-	Instances->erase(this);
 }
 
 void SctpTransport::onBufferedAmount(amount_callback callback) {
@@ -359,14 +356,6 @@ bool SctpTransport::stop() {
 	return true;
 }
 
-void SctpTransport::close() {
-	if (mSock) {
-		mProcessor.join();
-		usrsctp_close(mSock);
-		mSock = nullptr;
-	}
-}
-
 struct sockaddr_conn SctpTransport::getSockAddrConn(uint16_t port) {
 	struct sockaddr_conn sconn = {};
 	sconn.sconn_family = AF_CONN;
@@ -416,6 +405,18 @@ void SctpTransport::shutdown() {
 	mWrittenCondition.notify_all();
 }
 
+void SctpTransport::close() {
+	if (!mSock)
+		return;
+
+	usrsctp_deregister_address(this);
+	Instances->erase(this);
+
+	mProcessor.join();
+	usrsctp_close(mSock);
+	mSock = nullptr;
+}
+
 bool SctpTransport::send(message_ptr message) {
 	std::lock_guard lock(mSendMutex);
 
@@ -705,21 +706,26 @@ void SctpTransport::sendReset(uint16_t streamId) {
 }
 
 void SctpTransport::handleUpcall() {
-	if (!mSock)
-		return;
+	try {
+		if (!mSock)
+			return;
 
-	PLOG_VERBOSE << "Handle upcall";
+		PLOG_VERBOSE << "Handle upcall";
 
-	int events = usrsctp_get_events(mSock);
+		int events = usrsctp_get_events(mSock);
 
-	if (events & SCTP_EVENT_READ && mPendingRecvCount == 0) {
-		++mPendingRecvCount;
-		mProcessor.enqueue(&SctpTransport::doRecv, shared_from_this());
-	}
+		if (events & SCTP_EVENT_READ && mPendingRecvCount == 0) {
+			++mPendingRecvCount;
+			mProcessor.enqueue(&SctpTransport::doRecv, shared_from_this());
+		}
 
-	if (events & SCTP_EVENT_WRITE && mPendingFlushCount == 0) {
-		++mPendingFlushCount;
-		mProcessor.enqueue(&SctpTransport::doFlush, shared_from_this());
+		if (events & SCTP_EVENT_WRITE && mPendingFlushCount == 0) {
+			++mPendingFlushCount;
+			mProcessor.enqueue(&SctpTransport::doFlush, shared_from_this());
+		}
+
+	} catch (const std::exception &e) {
+		PLOG_ERROR << "SCTP upcall: " << e.what();
 	}
 }