Browse Source

Merge pull request #13 from paullouisageneau/stop-method

Stop transports before destruction
Paul-Louis Ageneau 5 years ago
parent
commit
5a8725dac1

+ 14 - 10
src/dtlstransport.cpp

@@ -85,17 +85,19 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
 }
 
 DtlsTransport::~DtlsTransport() {
-	resetLower();
-
-	mIncomingQueue.stop();
-	mRecvThread.join();
-
 	gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
 	gnutls_deinit(mSession);
 }
 
 DtlsTransport::State DtlsTransport::state() const { return mState; }
 
+void DtlsTransport::stop() {
+	Transport::stop();
+
+	mIncomingQueue.stop();
+	mRecvThread.join();
+}
+
 bool DtlsTransport::send(message_ptr message) {
 	if (!message || mState != State::Connected)
 		return false;
@@ -356,16 +358,18 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
 }
 
 DtlsTransport::~DtlsTransport() {
-	resetLower();
-
-	mIncomingQueue.stop();
-	mRecvThread.join();
-
 	SSL_shutdown(mSsl);
 	SSL_free(mSsl);
 	SSL_CTX_free(mCtx);
 }
 
+void DtlsTransport::stop() {
+	Transport::stop();
+
+	mIncomingQueue.stop();
+	mRecvThread.join();
+}
+
 DtlsTransport::State DtlsTransport::state() const { return mState; }
 
 bool DtlsTransport::send(message_ptr message) {

+ 1 - 0
src/dtlstransport.hpp

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

+ 3 - 1
src/icetransport.cpp

@@ -130,7 +130,9 @@ IceTransport::IceTransport(const Configuration &config, Description::Role role,
 	                       RecvCallback, this);
 }
 
-IceTransport::~IceTransport() {
+IceTransport::~IceTransport() {}
+
+void IceTransport::stop() {
 	g_main_loop_quit(mMainLoop.get());
 	mMainLoopThread.join();
 }

+ 2 - 1
src/icetransport.hpp

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

+ 7 - 0
src/peerconnection.cpp

@@ -37,6 +37,13 @@ PeerConnection::PeerConnection(const Configuration &config)
     : mConfig(config), mCertificate(make_certificate("libdatachannel")), mState(State::New) {}
 
 PeerConnection::~PeerConnection() {
+	if (mIceTransport)
+		mIceTransport->stop();
+	if (mDtlsTransport)
+		mDtlsTransport->stop();
+	if (mSctpTransport)
+		mSctpTransport->stop();
+
 	mSctpTransport.reset();
 	mDtlsTransport.reset();
 	mIceTransport.reset();

+ 13 - 12
src/sctptransport.cpp

@@ -143,8 +143,19 @@ SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
 }
 
 SctpTransport::~SctpTransport() {
-	resetLower();
-	onRecv(nullptr); // unset recv callback
+	if (mSock) {
+		usrsctp_shutdown(mSock, SHUT_RDWR);
+		usrsctp_close(mSock);
+	}
+
+	usrsctp_deregister_address(this);
+	GlobalCleanup();
+}
+
+SctpTransport::State SctpTransport::state() const { return mState; }
+
+void SctpTransport::stop() {
+	Transport::stop();
 
 	mSendQueue.stop();
 
@@ -154,14 +165,6 @@ SctpTransport::~SctpTransport() {
 		mConnectDataSent = true;
 		mConnectCondition.notify_all();
 	}
-
-	if (mSock) {
-		usrsctp_shutdown(mSock, SHUT_RDWR);
-		usrsctp_close(mSock);
-	}
-
-	usrsctp_deregister_address(this);
-	GlobalCleanup();
 }
 
 void SctpTransport::connect() {
@@ -186,8 +189,6 @@ void SctpTransport::connect() {
 		throw std::runtime_error("Connection attempt failed, errno=" + std::to_string(errno));
 }
 
-SctpTransport::State SctpTransport::state() const { return mState; }
-
 bool SctpTransport::send(message_ptr message) {
 	std::lock_guard<std::mutex> lock(mSendMutex);
 

+ 2 - 1
src/sctptransport.hpp

@@ -50,7 +50,8 @@ public:
 
 	State state() const;
 
-	bool send(message_ptr message); // false if buffered
+	void stop() override;
+	bool send(message_ptr message) override; // false if buffered
 	void reset(unsigned int stream);
 
 private:

+ 4 - 1
src/transport.hpp

@@ -36,13 +36,16 @@ public:
 		if (auto lower = std::atomic_load(&mLower))
 			lower->onRecv(std::bind(&Transport::incoming, this, _1));
 	}
-	virtual ~Transport() { resetLower(); }
+	virtual ~Transport() {}
 
+	virtual void stop() { resetLower(); }
 	virtual bool send(message_ptr message) = 0;
+
 	void onRecv(message_callback callback) { mRecvCallback = std::move(callback); }
 
 protected:
 	void recv(message_ptr message) { mRecvCallback(message); }
+
 	void resetLower() {
 		if (auto lower = std::atomic_exchange(&mLower, std::shared_ptr<Transport>(nullptr)))
 			lower->onRecv(nullptr);