Added stop method on transports to stop them before destroying them

This commit is contained in:
Paul-Louis Ageneau
2019-12-15 20:10:19 +01:00
parent de5aff68e6
commit cd66a3f987
8 changed files with 46 additions and 26 deletions

View File

@ -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) {

View File

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

View File

@ -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();
}

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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:

View File

@ -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);