[C++] Fixed race condition in MemoryLimitController (#10142)
diff --git a/pulsar-client-cpp/lib/MemoryLimitController.cc b/pulsar-client-cpp/lib/MemoryLimitController.cc
index 7ace3fe..81578c9 100644
--- a/pulsar-client-cpp/lib/MemoryLimitController.cc
+++ b/pulsar-client-cpp/lib/MemoryLimitController.cc
@@ -42,9 +42,14 @@
}
void MemoryLimitController::reserveMemory(uint64_t size) {
- while (!tryReserveMemory(size)) {
+ if (!tryReserveMemory(size)) {
std::unique_lock<std::mutex> lock(mutex_);
- condition_.wait(lock);
+
+ // Check again, while holding the lock, to ensure we reserve attempt and the waiting for the condition
+ // are synchronized.
+ while (!tryReserveMemory(size)) {
+ condition_.wait(lock);
+ }
}
}