Browse Source

Some cleanup to thread handling

Paul-Louis Ageneau 5 years ago
parent
commit
21f43611b6
4 changed files with 12 additions and 13 deletions
  1. 6 4
      src/dtlstransport.cpp
  2. 1 2
      src/icetransport.cpp
  3. 4 5
      src/sctptransport.cpp
  4. 1 2
      src/sctptransport.hpp

+ 6 - 4
src/dtlstransport.cpp

@@ -83,11 +83,13 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
 }
 }
 
 
 DtlsTransport::~DtlsTransport() {
 DtlsTransport::~DtlsTransport() {
-  onRecv(nullptr);
+	onRecv(nullptr); // unset recv callback
+
 	mIncomingQueue.stop();
 	mIncomingQueue.stop();
-  mRecvThread.join();
-  gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
-  gnutls_deinit(mSession);
+	mRecvThread.join();
+
+	gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
+	gnutls_deinit(mSession);
 }
 }
 
 
 DtlsTransport::State DtlsTransport::state() const { return mState; }
 DtlsTransport::State DtlsTransport::state() const { return mState; }

+ 1 - 2
src/icetransport.cpp

@@ -132,8 +132,7 @@ IceTransport::IceTransport(const Configuration &config, Description::Role role,
 
 
 IceTransport::~IceTransport() {
 IceTransport::~IceTransport() {
 	g_main_loop_quit(mMainLoop.get());
 	g_main_loop_quit(mMainLoop.get());
-	if (mMainLoopThread.joinable())
-		mMainLoopThread.join();
+	mMainLoopThread.join();
 }
 }
 
 
 Description::Role IceTransport::role() const { return mRole; }
 Description::Role IceTransport::role() const { return mRole; }

+ 4 - 5
src/sctptransport.cpp

@@ -116,23 +116,22 @@ SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port, me
 	if (usrsctp_bind(mSock, reinterpret_cast<struct sockaddr *>(&sconn), sizeof(sconn)))
 	if (usrsctp_bind(mSock, reinterpret_cast<struct sockaddr *>(&sconn), sizeof(sconn)))
 		throw std::runtime_error("Could not bind usrsctp socket, errno=" + std::to_string(errno));
 		throw std::runtime_error("Could not bind usrsctp socket, errno=" + std::to_string(errno));
 
 
-	mConnectThread = std::thread(&SctpTransport::runConnectAndSendLoop, this);
+	mSendThread = std::thread(&SctpTransport::runConnectAndSendLoop, this);
 }
 }
 
 
 SctpTransport::~SctpTransport() {
 SctpTransport::~SctpTransport() {
-	onRecv(nullptr);
+	onRecv(nullptr); // unset recv callback
 	mStopping = true;
 	mStopping = true;
 	mConnectCondition.notify_all();
 	mConnectCondition.notify_all();
 	mSendQueue.stop();
 	mSendQueue.stop();
 
 
-	if (mConnectThread.joinable())
-		mConnectThread.join();
-
 	if (mSock) {
 	if (mSock) {
 		usrsctp_shutdown(mSock, SHUT_RDWR);
 		usrsctp_shutdown(mSock, SHUT_RDWR);
 		usrsctp_close(mSock);
 		usrsctp_close(mSock);
 	}
 	}
 
 
+	mSendThread.join();
+
 	usrsctp_deregister_address(this);
 	usrsctp_deregister_address(this);
 	GlobalCleanup();
 	GlobalCleanup();
 }
 }

+ 1 - 2
src/sctptransport.hpp

@@ -77,14 +77,13 @@ private:
 	uint16_t mPort;
 	uint16_t mPort;
 
 
 	Queue<message_ptr> mSendQueue;
 	Queue<message_ptr> mSendQueue;
-	std::thread mConnectThread;
+	std::thread mSendThread;
 	std::mutex mConnectMutex;
 	std::mutex mConnectMutex;
 	std::condition_variable mConnectCondition;
 	std::condition_variable mConnectCondition;
 	std::atomic<bool> mConnectDataSent = false;
 	std::atomic<bool> mConnectDataSent = false;
 	std::atomic<bool> mStopping = false;
 	std::atomic<bool> mStopping = false;
 
 
 	std::atomic<State> mState;
 	std::atomic<State> mState;
-
 	state_callback mStateChangeCallback;
 	state_callback mStateChangeCallback;
 
 
 	static int WriteCallback(void *sctp_ptr, void *data, size_t len, uint8_t tos, uint8_t set_df);
 	static int WriteCallback(void *sctp_ptr, void *data, size_t len, uint8_t tos, uint8_t set_df);