Commit 29b48d3d2fba06182c708c2389c2a1a686a8cc65
1 parent
6b57d025
Fix condition variable usage in Command
Similar to the fixes for subscriber, without holding the waiter_lock_, updating the waiting_done_ flag may cause deadlock. In the deadlock example below, Thread1 is waiting for the response, thread 2 is processing the response and updating the waiter_lock_ variable: ---------------------------------------------------- | Thread 1 | Thread 2 | ---------------------------------------------------- | locks 'waiter_lock_' | | | check 'waiting_done_' | | | | Update 'waiting done' | | | Send notification | | begin waiting for signal | | | *deadlocked* | | ----------------------------------------------------
Showing
1 changed file
with
4 additions
and
1 deletions
src/command.cpp
| ... | ... | @@ -64,7 +64,10 @@ template <class ReplyT> void Command<ReplyT>::processReply(redisReply *r) { |
| 64 | 64 | |
| 65 | 65 | pending_--; |
| 66 | 66 | |
| 67 | - waiting_done_ = true; | |
| 67 | + { | |
| 68 | + unique_lock<mutex> lk(waiter_lock_); | |
| 69 | + waiting_done_ = true; | |
| 70 | + } | |
| 68 | 71 | waiter_.notify_all(); |
| 69 | 72 | |
| 70 | 73 | // Always free the reply object for repeating commands | ... | ... |