Browse Source

Revised transports stop method

Paul-Louis Ageneau 5 years ago
parent
commit
c767e82d64
7 changed files with 45 additions and 39 deletions
  1. 18 17
      src/dtlstransport.cpp
  2. 1 1
      src/dtlstransport.hpp
  3. 13 8
      src/icetransport.cpp
  4. 1 1
      src/icetransport.hpp
  5. 8 8
      src/sctptransport.cpp
  6. 1 3
      src/sctptransport.hpp
  7. 3 1
      src/transport.hpp

+ 18 - 17
src/dtlstransport.cpp

@@ -110,15 +110,16 @@ DtlsTransport::~DtlsTransport() {
 
 DtlsTransport::State DtlsTransport::state() const { return mState; }
 
-void DtlsTransport::stop() {
-	Transport::stop();
+bool DtlsTransport::stop() {
+	if (!Transport::stop())
+		return false;
 
-	if (mRecvThread.joinable()) {
-		PLOG_DEBUG << "Stopping DTLS recv thread";
-		mIncomingQueue.stop();
-		gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
-		mRecvThread.join();
-	}
+	PLOG_DEBUG << "Stopping DTLS recv thread";
+	mIncomingQueue.stop();
+	gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
+	mRecvThread.join();
+	onRecv(nullptr);
+	return true;
 }
 
 bool DtlsTransport::send(message_ptr message) {
@@ -417,16 +418,16 @@ DtlsTransport::~DtlsTransport() {
 	SSL_CTX_free(mCtx);
 }
 
-void DtlsTransport::stop() {
-	Transport::stop();
-
-	if (mRecvThread.joinable()) {
-		PLOG_DEBUG << "Stopping DTLS recv thread";
-		mIncomingQueue.stop();
-		mRecvThread.join();
+bool DtlsTransport::stop() {
+	if (!Transport::stop())
+		return false;
 
-		SSL_shutdown(mSsl);
-	}
+	PLOG_DEBUG << "Stopping DTLS recv thread";
+	mIncomingQueue.stop();
+	mRecvThread.join();
+	SSL_shutdown(mSsl);
+	onRecv(nullptr);
+	return true;
 }
 
 DtlsTransport::State DtlsTransport::state() const { return mState; }

+ 1 - 1
src/dtlstransport.hpp

@@ -57,7 +57,7 @@ public:
 
 	State state() const;
 
-	void stop() override;
+	bool stop() override;
 	bool send(message_ptr message) override; // false if dropped
 
 private:

+ 13 - 8
src/icetransport.cpp

@@ -18,6 +18,7 @@
 
 #include "icetransport.hpp"
 #include "configuration.hpp"
+#include "transport.hpp"
 
 #include <iostream>
 #include <random>
@@ -96,8 +97,9 @@ IceTransport::IceTransport(const Configuration &config, Description::Role role,
 
 IceTransport::~IceTransport() { stop(); }
 
-void IceTransport::stop() {
-	// Nothing to do
+bool IceTransport::stop() {
+	onRecv(nullptr);
+	return Transport::stop();
 }
 
 Description::Role IceTransport::role() const { return mRole; }
@@ -426,16 +428,19 @@ IceTransport::IceTransport(const Configuration &config, Description::Role role,
 
 IceTransport::~IceTransport() { stop(); }
 
-void IceTransport::stop() {
+bool IceTransport::stop() {
 	if (mTimeoutId) {
 		g_source_remove(mTimeoutId);
 		mTimeoutId = 0;
 	}
-	if (mMainLoopThread.joinable()) {
-		PLOG_DEBUG << "Stopping ICE thread";
-		g_main_loop_quit(mMainLoop.get());
-		mMainLoopThread.join();
-	}
+
+	if (!Transport::stop())
+		return false;
+
+	PLOG_DEBUG << "Stopping ICE thread";
+	g_main_loop_quit(mMainLoop.get());
+	mMainLoopThread.join();
+	return true;
 }
 
 Description::Role IceTransport::role() const { return mRole; }

+ 1 - 1
src/icetransport.hpp

@@ -79,7 +79,7 @@ public:
 	std::optional<string> getLocalAddress() const;
 	std::optional<string> getRemoteAddress() const;
 
-	void stop() override;
+	bool stop() override;
 	bool send(message_ptr message) override; // false if dropped
 
 private:

+ 8 - 8
src/sctptransport.cpp

@@ -175,15 +175,15 @@ SctpTransport::~SctpTransport() {
 
 SctpTransport::State SctpTransport::state() const { return mState; }
 
-void SctpTransport::stop() {
-	Transport::stop();
-	onRecv(nullptr);
+bool SctpTransport::stop() {
+	if (!Transport::stop())
+		return false;
 
-	if (!mShutdown.exchange(true)) {
-		mSendQueue.stop();
-		safeFlush();
-		shutdown();
-	}
+	mSendQueue.stop();
+	safeFlush();
+	shutdown();
+	onRecv(nullptr);
+	return true;
 }
 
 void SctpTransport::connect() {

+ 1 - 3
src/sctptransport.hpp

@@ -49,7 +49,7 @@ public:
 
 	State state() const;
 
-	void stop() override;
+	bool stop() override;
 	bool send(message_ptr message) override; // false if buffered
 	void flush();
 	void reset(unsigned int stream);
@@ -98,8 +98,6 @@ private:
 	bool mWritten = false;
 	bool mWrittenOnce = false;
 
-	std::atomic<bool> mShutdown = false;
-
 	state_callback mStateChangeCallback;
 	std::atomic<State> mState;
 

+ 3 - 1
src/transport.hpp

@@ -38,9 +38,10 @@ public:
 	}
 	virtual ~Transport() { stop(); }
 
-	virtual void stop() {
+	virtual bool stop() {
 		if (mLower)
 			mLower->onRecv(nullptr);
+		return !mShutdown.exchange(true);
 	}
 
 	virtual bool send(message_ptr message) = 0;
@@ -61,6 +62,7 @@ protected:
 private:
 	std::shared_ptr<Transport> mLower;
 	synchronized_callback<message_ptr> mRecvCallback;
+	std::atomic<bool> mShutdown = false;
 };
 
 } // namespace rtc