diff --git a/frameworks/js/napi/tls/src/tls_socket.cpp b/frameworks/js/napi/tls/src/tls_socket.cpp index 7adac3ed72c59fd9e47c8f093a29f49d1c3a4599..bc33909ad13d7daa5c93bb55994efde7c8906d89 100644 --- a/frameworks/js/napi/tls/src/tls_socket.cpp +++ b/frameworks/js/napi/tls/src/tls_socket.cpp @@ -520,22 +520,27 @@ int TLSSocket::ReadMessage() void TLSSocket::StartReadMessage() { - std::thread thread([this]() { - isRunning_ = true; - isRunOver_ = false; + auto wp = std::weak_ptr(shared_from_this()); + std::thread thread([wp]() { + auto tlsSocket = wp.lock(); + if (tlsSocket == nullptr) { + return; + } + tlsSocket->isRunning_ = true; + tlsSocket->isRunOver_ = false; #if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(TLS_SOCKET_CLIENT_READ); #else pthread_setname_np(pthread_self(), TLS_SOCKET_CLIENT_READ); #endif - while (isRunning_) { - int ret = ReadMessage(); + while (tlsSocket->isRunning_) { + int ret = tlsSocket->ReadMessage(); if (ret < 0) { break; } } - isRunOver_ = true; - cvSslFree_.notify_one(); + tlsSocket->isRunOver_ = true; + tlsSocket->cvSslFree_.notify_one(); }); thread.detach(); } @@ -835,7 +840,14 @@ void TLSSocket::Close(const CloseCallback &callback) { isRunning_ = false; std::unique_lock cvLock(cvMutex_); - cvSslFree_.wait(cvLock, [this]() -> bool { return isRunOver_; }); + auto wp = std::weak_ptr(shared_from_this()); + cvSslFree_.wait(cvLock, [wp]() -> bool { + auto tlsSocket = wp.lock(); + if (tlsSocket == nullptr) { + return true; + } + return tlsSocket->isRunOver_; + }); std::lock_guard lock(recvMutex_); auto res = tlsSocketInternal_.Close(); diff --git a/interfaces/innerkits/tls_socket/include/tls_socket.h b/interfaces/innerkits/tls_socket/include/tls_socket.h index 610e856d108c904aac5c60b6b8f494e77fc9b393..79cf39ae7ad99a3d69b23aec5a4344adf3f50009 100644 --- a/interfaces/innerkits/tls_socket/include/tls_socket.h +++ b/interfaces/innerkits/tls_socket/include/tls_socket.h @@ -291,7 +291,7 @@ private: /** * TLS socket interface class */ -class TLSSocket { +class TLSSocket : public std::enable_shared_from_this { public: TLSSocket(const TLSSocket &) = delete; TLSSocket(TLSSocket &&) = delete;