connectionmanager: avoid deadlock on cinfo->mtx_
cinfo->mtx_ MUST be locked before socketsMutex, so it SHOULD never
be locked in a callback. Retrigger the lock in its own thread avoid
a deadlock there.
GitLab: #20
Change-Id: If17af7db81d8ca2b990629446b5d78dc11a785b1
diff --git a/src/connectionmanager.cpp b/src/connectionmanager.cpp
index 37becf7..523d90d 100644
--- a/src/connectionmanager.cpp
+++ b/src/connectionmanager.cpp
@@ -1062,10 +1062,13 @@
[dinfow, cinfow, wSock = std::weak_ptr(channelSock), name, vid](bool accepted) {
if (auto dinfo = dinfow.lock()) {
dinfo->executePendingOperations(vid, accepted ? wSock.lock() : nullptr, accepted);
- if (auto cinfo = cinfow.lock()) {
- std::lock_guard<std::mutex> lk(cinfo->mutex_);
- cinfo->cbIds_.erase(vid);
- }
+ // Always lock top-down cinfo->mutex
+ dht::ThreadPool::io().run([cinfow, vid]() {
+ if (auto cinfo = cinfow.lock()) {
+ std::lock_guard<std::mutex> lk(cinfo->mutex_);
+ cinfo->cbIds_.erase(vid);
+ }
+ });
}
});