Skip to content

Commit 9c2e6eb

Browse files
Fix a deadlock by locking twice mutex_ in same thread. (#2646)
We enter the following situation where we lock twice the same mutex in 1 thread: backtrace PerfMetric/PerfMetrics.hpp:74/resetEntries() -> locks: std::lock_guard<std::mutex> lock(mutex_) PerfMetric/PerfMetrics.hpp:115/finishMeasurementUnSafe() PerfMetric/PerfMetrics.hpp:55/finishMeasurement(const T& key) -> locks: std::lock_guard<std::mutex> lock(mutex_) bftEngine::impl::ReplicaImp::addRequestToPrePrepareMessage/ReplicaImp.cpp:720 ReplicaImp::buildPrePrepareMessageByRequestsNum
1 parent d90621c commit 9c2e6eb

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

util/include/PerfMetrics.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class PerfMetric {
4242

4343
void addStartTimeStamp(const T& key) {
4444
if (is_thread_safe_) {
45-
std::lock_guard<std::mutex> lock(mutex_);
45+
std::lock_guard<std::recursive_mutex> lock(mutex_);
4646
addStartTimeStampUnSafe(key);
4747
} else {
4848
addStartTimeStampUnSafe(key);
@@ -51,7 +51,7 @@ class PerfMetric {
5151

5252
void finishMeasurement(const T& key) {
5353
if (is_thread_safe_) {
54-
std::lock_guard<std::mutex> lock(mutex_);
54+
std::lock_guard<std::recursive_mutex> lock(mutex_);
5555
finishMeasurementUnSafe(key);
5656
} else {
5757
finishMeasurementUnSafe(key);
@@ -60,7 +60,7 @@ class PerfMetric {
6060

6161
void deleteSingleEntry(const T& key) {
6262
if (is_thread_safe_) {
63-
std::lock_guard<std::mutex> lock(mutex_);
63+
std::lock_guard<std::recursive_mutex> lock(mutex_);
6464
deleteSingleEntryUnSafe(key);
6565
} else {
6666
deleteSingleEntryUnSafe(key);
@@ -71,7 +71,7 @@ class PerfMetric {
7171
// to prevent entries in the map from never being erased (measurements that started but never finished)
7272
void resetEntries() {
7373
if (is_thread_safe_) {
74-
std::lock_guard<std::mutex> lock(mutex_);
74+
std::lock_guard<std::recursive_mutex> lock(mutex_);
7575
entries_.clear();
7676
} else {
7777
entries_.clear();
@@ -125,7 +125,7 @@ class PerfMetric {
125125
}
126126
}
127127

128-
std::mutex mutex_;
128+
std::recursive_mutex mutex_;
129129
uint64_t num_map_entries_for_reset_;
130130
int moving_avg_window_size_;
131131
bool is_thread_safe_;

0 commit comments

Comments
 (0)