mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-22 23:25:33 +00:00
Merge pull request #13 from paullouisageneau/stop-method
Stop transports before destruction
This commit is contained in:
@ -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) {
|
||||
|
@ -54,6 +54,7 @@ public:
|
||||
|
||||
State state() const;
|
||||
|
||||
void stop() override;
|
||||
bool send(message_ptr message); // false if dropped
|
||||
|
||||
private:
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user