Skip to content

Commit 2b88c09

Browse files
committed
[BugFix] fix ANR of debug-router
There is a scenario where the sessionlist acquires the same lock repeatedly. It is necessary to replace it with a reentrant lock. issue:#22
1 parent 1dfafac commit 2b88c09

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

debug_router/Common/debug_router.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ void DebugRouter::SetAppInfo(const std::string &key, const std::string &value) {
190190

191191
std::string DebugRouter::GetAppInfoByKey(const std::string &key) {
192192
return core::DebugRouterCore::GetInstance().GetAppInfoByKey(key);
193+
}
193194

194195
} // namespace common
195196
} // namespace debugrouter

debug_router/native/core/debug_router_core.cc

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "debug_router_core.h"
66

77
#include <atomic>
8+
#include <mutex>
89

910
#include "debug_router/native/base/no_destructor.h"
1011
#include "debug_router/native/core/debug_router_config.h"
@@ -18,13 +19,12 @@
1819
#include "debug_router/native/processor/processor.h"
1920
#include "debug_router/native/thread/debug_router_executor.h"
2021
#include "json/value.h"
21-
#include <mutex>
2222

2323
namespace debugrouter {
2424

2525
namespace core {
2626
class MessageHandlerCore : public processor::MessageHandler {
27-
public:
27+
public:
2828
MessageHandlerCore() {}
2929

3030
std::string GetRoomId() override {
@@ -37,7 +37,8 @@ class MessageHandlerCore : public processor::MessageHandler {
3737

3838
std::unordered_map<int, std::string> GetSessionList() override {
3939
std::unordered_map<int, std::string> session_list;
40-
std::lock_guard<std::mutex> lock(DebugRouterCore::GetInstance().slots_mutex_);
40+
std::lock_guard<std::recursive_mutex> lock(
41+
DebugRouterCore::GetInstance().slots_mutex_);
4142
const auto &slots = DebugRouterCore::GetInstance().slots_;
4243
if (!slots.empty()) {
4344
for (auto it = slots.begin(); it != slots.end(); ++it) {
@@ -76,7 +77,8 @@ class MessageHandlerCore : public processor::MessageHandler {
7677

7778
const auto &session_handler_map =
7879
DebugRouterCore::GetInstance().session_handler_map_;
79-
std::lock_guard<std::mutex> lock(DebugRouterCore::GetInstance().slots_mutex_);
80+
std::lock_guard<std::recursive_mutex> lock(
81+
DebugRouterCore::GetInstance().slots_mutex_);
8082
const auto &slots = DebugRouterCore::GetInstance().slots_;
8183
for (auto it : session_handler_map) {
8284
it.second->OnMessage(message, type, session_id);
@@ -116,8 +118,11 @@ DebugRouterCore &DebugRouterCore::GetInstance() {
116118
}
117119

118120
DebugRouterCore::DebugRouterCore()
119-
: connection_state_(DISCONNECTED), current_transceiver_(nullptr),
120-
max_session_id_(0), processor_(nullptr), handler_count_(1) {
121+
: connection_state_(DISCONNECTED),
122+
current_transceiver_(nullptr),
123+
max_session_id_(0),
124+
processor_(nullptr),
125+
handler_count_(1) {
121126
message_transceivers_.push_back(std::make_shared<net::WebSocketClient>());
122127
message_transceivers_.push_back(std::make_shared<net::SocketServerClient>());
123128

@@ -207,7 +212,7 @@ void DebugRouterCore::SendDataAsync(const std::string &data,
207212
}
208213

209214
int32_t DebugRouterCore::Plug(const std::shared_ptr<core::NativeSlot> &slot) {
210-
std::lock_guard<std::mutex> lock(slots_mutex_);
215+
std::lock_guard<std::recursive_mutex> lock(slots_mutex_);
211216
max_session_id_++;
212217
slots_[max_session_id_] = slot;
213218
LOGI("plug session: " << max_session_id_);
@@ -227,7 +232,7 @@ int32_t DebugRouterCore::GetUSBPort() {
227232

228233
void DebugRouterCore::Pull(int32_t session_id_) {
229234
LOGI("pull session: " << session_id_);
230-
std::lock_guard<std::mutex> lock(slots_mutex_);
235+
std::lock_guard<std::recursive_mutex> lock(slots_mutex_);
231236
slots_.erase(session_id_);
232237
if (connection_state_.load(std::memory_order_relaxed) == CONNECTED) {
233238
processor_->FlushSessionList();
@@ -521,5 +526,5 @@ std::string DebugRouterCore::GetConnectionStateMsg(ConnectionState state) {
521526
}
522527
}
523528

524-
} // namespace core
525-
} // namespace debugrouter
529+
} // namespace core
530+
} // namespace debugrouter

debug_router/native/core/debug_router_core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class DebugRouterCore : public MessageTransceiverDelegate {
112112
DebugRouterCore &operator=(DebugRouterCore &&) = delete;
113113

114114
protected:
115-
std::mutex slots_mutex_;
115+
std::recursive_mutex slots_mutex_;
116116
friend class MessageHandlerCore;
117117
std::unordered_map<int32_t, std::shared_ptr<core::NativeSlot> > slots_;
118118
std::string room_id_;

0 commit comments

Comments
 (0)