Browse Source

Replaced flush() by safeFlush() in SCTP transport destructor

Paul-Louis Ageneau 5 years ago
parent
commit
1ea4fad7c8
2 changed files with 15 additions and 11 deletions
  1. 14 11
      src/sctptransport.cpp
  2. 1 0
      src/sctptransport.hpp

+ 14 - 11
src/sctptransport.cpp

@@ -187,7 +187,7 @@ void SctpTransport::stop() {
 
 
 	if (!mShutdown.exchange(true)) {
 	if (!mShutdown.exchange(true)) {
 		mSendQueue.stop();
 		mSendQueue.stop();
-		flush();
+		safeFlush();
 		shutdown();
 		shutdown();
 	}
 	}
 }
 }
@@ -390,11 +390,23 @@ void SctpTransport::updateBufferedAmount(uint16_t streamId, long delta) {
 	mBufferedAmountCallback(streamId, amount);
 	mBufferedAmountCallback(streamId, amount);
 }
 }
 
 
+bool SctpTransport::safeFlush() {
+	try {
+		flush();
+		return true;
+
+	} catch (const std::exception &e) {
+		PLOG_ERROR << "SCTP flush: " << e.what();
+		return false;
+	}
+}
+
 int SctpTransport::handleRecv(struct socket *sock, union sctp_sockstore addr, const byte *data,
 int SctpTransport::handleRecv(struct socket *sock, union sctp_sockstore addr, const byte *data,
                               size_t len, struct sctp_rcvinfo info, int flags) {
                               size_t len, struct sctp_rcvinfo info, int flags) {
 	try {
 	try {
 		if (!len)
 		if (!len)
 			return -1;
 			return -1;
+
 		if (flags & MSG_EOR) {
 		if (flags & MSG_EOR) {
 			if (!mPartialRecv.empty()) {
 			if (!mPartialRecv.empty()) {
 				mPartialRecv.insert(mPartialRecv.end(), data, data + len);
 				mPartialRecv.insert(mPartialRecv.end(), data, data + len);
@@ -419,16 +431,7 @@ int SctpTransport::handleRecv(struct socket *sock, union sctp_sockstore addr, co
 	return 0; // success
 	return 0; // success
 }
 }
 
 
-int SctpTransport::handleSend(size_t free) {
-	try {
-		std::lock_guard lock(mSendMutex);
-		trySendQueue();
-	} catch (const std::exception &e) {
-		PLOG_ERROR << "SCTP send: " << e.what();
-		return -1;
-	}
-	return 0; // success
-}
+int SctpTransport::handleSend(size_t free) { return safeFlush() ? 0 : -1; }
 
 
 int SctpTransport::handleWrite(byte *data, size_t len, uint8_t tos, uint8_t set_df) {
 int SctpTransport::handleWrite(byte *data, size_t len, uint8_t tos, uint8_t set_df) {
 	try {
 	try {

+ 1 - 0
src/sctptransport.hpp

@@ -72,6 +72,7 @@ private:
 	bool trySendQueue();
 	bool trySendQueue();
 	bool trySendMessage(message_ptr message);
 	bool trySendMessage(message_ptr message);
 	void updateBufferedAmount(uint16_t streamId, long delta);
 	void updateBufferedAmount(uint16_t streamId, long delta);
+	bool safeFlush();
 
 
 	int handleRecv(struct socket *sock, union sctp_sockstore addr, const byte *data, size_t len,
 	int handleRecv(struct socket *sock, union sctp_sockstore addr, const byte *data, size_t len,
 	               struct sctp_rcvinfo recv_info, int flags);
 	               struct sctp_rcvinfo recv_info, int flags);